2017-07-23 7 views
0

Ich versuche, eine Middleware zur Authentifizierung mit JWT zu erstellen, aber in der Ansicht der Anfrage.Anwender ist immer AnonymUser.Wie hinzufügen Middleware JWT django authentifizieren?

Wenn ich überprüfen, ob die Middleware die request.user vom Benutzermodell ändert, ist es der Fall ist, sondern auf die Ansicht zu erreichen, aus irgendeinem Grund ist die request.user immer AnonymousUser

I'n mit Django 1.11

+0

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', ] –

Antwort

0

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