Ошибка отсутствия у объекта 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?