0

Ich verwende Django Token basierte Authentifizierung. (JWT-Token wird von Drittanbietern wie AWS Cognito generiert. Wir überprüfen lediglich die Signatur und Ablaufzeit).Djangos Token basierte Authentifizierung ohne User-Modell

Diese REST Anwendung werden keine Benutzermodelle haben, wer auch immer die API-Aufrufe raubend müssen von JWT Token nur authentifiziert werden.

class JSONWebTokenAuthentication(TokenAuthentication): 
    def authenticate_credentials(self, jwtToken): 
     try: 
      payload = jwt.decode(jwtToken, secret_key,verify=True) 
      # user = User.objects.get(username='root') 
      user = AnonymousUser() 
     except (jwt.DecodeError, User.DoesNotExist): 
      raise exceptions.AuthenticationFailed('Invalid token) 
     except jwt.ExpiredSignatureError: 
      raise exceptions.AuthenticationFailed('Token has expired') 
     return (user, payload) 

In Aufrufe:

@api_view(["POST"]) 
@authentication_classes((JSONWebTokenAuthentication,)) 
@permission_classes((AllowAny,)) 

Above Prozess, nicht im Auge behalten von Token alle an. Mit/Ohne Token funktionieren APi-Anrufe. Wenn ich unter zwei Änderungen mache, funktioniert es.

user = User.objects.get(username='root') 
#user = AnonymousUser() 
@permission_classes((IsAuthenticated,)) 

Eine Möglichkeit, es zu tun ist, atleast einen Benutzer in meiner app und Referenz zu haben, dass Benutzer [Diese Webapp auf einem beliebige Anzahl von Instanzen skalieren können, wenn erforderlich, so den gleichen Benutzer mit dem gleichen „username“ Einfügen hat automatisiert werden. ]. Aber kann ich stattdessen das "Benutzer" -Konzept in der Authentifizierung eliminieren?

Antwort

1

Django REST-Framework geht weitgehend davon aus, dass Anfragen basierend auf einem Benutzer authentifiziert werden, aber sie bieten Unterstützung für anonyme Authentifizierungsanfragen. Aber es hebt sich von der Standardannahme des "Überprüfens (django) Benutzers ist echt" ab, indem es anonymen Benutzern bestimmte Erlaubnis gibt. Das Problem mit Ihrem ersten Fall ist Erlaubnis Dekorateur mit "Allow Any".

Ich schlage vor, einen Dummy-Django Benutzer zu haben. (Es hindert Sie nicht daran, auch auf beliebig viele Instanzen zu skalieren).

Verwenden

user = User.objects.get_or_create(username='whatever')[0] 

statt

user = AnonymousUser() 

nun die Erlaubnis Dekorateur

@permission_classes((IsAuthenticated,)) 

können Dieser Benutzer ändern, indem jemand nicht angemeldet sein, wenn Sie ein Kennwort festlegen, außerdem die Protokollierung In diesem Fall erhalten Sie keinen Zugriff auf Ihren API-Aufruf. Die einzige Möglichkeit, auf Ihre API zuzugreifen, besteht darin, ein gültiges Token zu senden.

Hoffe, das hilft.

+0

Danke. Es funktionierte als Workaround für mich. Wenn ich Drittanbieter-Tools wie AWS-Cognito verwende, glaube ich, dass uns das Django-Benutzermodell überhaupt nicht interessieren sollte. –

0

Validierung versuchen, wenn die JWT-Token oder nicht vorhanden ist. Es scheint, dass Payload einfach None ist und der Benutzer anonym ist.

+0

Ich habe das auch versucht. Unabhängig von wenn nicht jwt_token: zurück Keine API-Aufrufe sind für jedermann zugänglich. –

+0

Sollten Sie keine Authentifizierungsfehler erhöhen, wenn JWT Token nicht da ist? – bdbd

Verwandte Themen