Ошибка отсутствия у объекта Authlib JWT 'NoneType' атрибута 'startswith' при получении открытого ключа из JWKS

Я работаю над Django-приложением, которое использует Authlib для JWT-аутентификации, с Auth0 в качестве провайдера идентификации. Я получаю открытый ключ из конечной точки JWKS, предоставленной Auth0, чтобы подтвердить JWT. Однако при декодировании токена я сталкиваюсь со следующей ошибкой:

Error: AttributeError: 'NoneType' object has no attribute 'startswith'

Эта ошибка возникает при обработке открытого ключа из ответа JWKS. Я подозреваю, что это может быть проблема с получением или декодированием ключа, особенно с полем x5c. Я не знаю, как правильно это обработать.

Вот моя текущая реализация промежуточного ПО:

import os
import requests
from authlib.jose import JsonWebToken
from django.utils.deprecation import MiddlewareMixin
from rest_framework.exceptions import AuthenticationFailed
from dotenv import load_dotenv

# Load environment variables from the .env file
load_dotenv()

class Auth0Middleware(MiddlewareMixin):
    def __init__(self, get_response=None):
        self.get_response = get_response
        self.jwt = JsonWebToken([os.getenv('ALGORITHMS', 'RS256')])  # Load algorithm from env
        self.jwks_url = f"https://{os.getenv('AUTH0_DOMAIN')}/.well-known/jwks.json"  # Load Auth0 domain from env
        self.jwks = self.get_jwks()

    def get_jwks(self):
        response = requests.get(self.jwks_url)
        if response.status_code == 200:
            return response.json()
        raise AuthenticationFailed("Failed to fetch JWKS")

    def get_public_key(self, token):
        try:
            headers = self.jwt.decode(token, None, claims_cls=None)
            kid = headers.get('kid')
            for key in self.jwks['keys']:
                if key['kid'] == kid:
                    raw_key = key.get('x5c', [])
                    if not raw_key or not isinstance(raw_key, list) or not raw_key[0]:
                        raise AuthenticationFailed("Invalid or missing x5c field in JWKS.")
                    return self.convert_to_pem(raw_key[0])
        except Exception as e:
            raise AuthenticationFailed(f"Error fetching public key: {str(e)}")

    def convert_to_pem(self, raw_key):
        return f"-----BEGIN CERTIFICATE-----\n{raw_key}\n-----END CERTIFICATE-----"```



Am I handling the public key extraction and JWT decoding correctly, or is there a better approach to prevent this error?
Вернуться на верх