Ich habe versucht, Ihren Fehler zu replizieren, aber in meinem Fall, es funktioniert nur gut, ich denke, die Ursache des Problems ist die Ausnahmebehandlung Methode. jwt.decode kann mehrere Arten von Ausnahmen auslösen, einschließlich DecodeError
, ExpiredSignatureError
, InvalidKeyError
und viele mehr, sogar das aus jwt.decode abgerufene Diktat konnte keinen 'user_id' Schlüssel haben.
Dies ist ein voll funktionsfähiger Code
# coding=utf-8
import jwt
import traceback
from django.utils.functional import SimpleLazyObject
from django.utils.deprecation import MiddlewareMixin
from django.contrib.auth.models import AnonymousUser, User
from django.conf import LazySettings
from django.contrib.auth.middleware import get_user
settings = LazySettings()
class JWTAuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
request.user = SimpleLazyObject(lambda: self.__class__.get_jwt_user(request))
@staticmethod
def get_jwt_user(request):
user_jwt = get_user(request)
if user_jwt.is_authenticated():
return user_jwt
token = request.META.get('HTTP_AUTHORIZATION', None)
user_jwt = AnonymousUser()
if token is not None:
try:
user_jwt = jwt.decode(
token,
settings.WP_JWT_TOKEN,
)
user_jwt = User.objects.get(
id=user_jwt['data']['user']['id']
)
except Exception as e: # NoQA
traceback.print_exc()
return user_jwt
Nur ein paar Überlegungen mehr, ist immer eine gute Praxis Verwendung LazySettings Einstellungen statt Check this thread
Auch das ist meine Middleware um
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'applications.custom_authentication.middleware.JWTAuthenticationMiddleware', # This is my middleware
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Denken Sie daran, Ihre benutzerdefinierte Middleware nach django.contrib.auth.middleware.AuthenticationMiddleware
Middleware
zu setzen
MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'user.middlewares.JWTAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] –