2014-12-17 4 views
14

Meine Django-Anwendung verwendet die Rest Framework JWT für die Authentifizierung. Es funktioniert großartig und sehr elegant.Wie wird die JSON-Web-Token-Authentifizierung von Django durchgeführt, ohne dass der Benutzer sein Kennwort erneut eingeben muss?

Allerdings habe ich einen Anwendungsfall, den ich zu bauen werde kämpfen. Ich habe bereits eine funktionierende Lösung für den Workflow "Passwort vergessen" programmiert. Ich erlaube einem nicht authentifizierten Benutzer, sein Passwort nur dann und nur dann zurückzusetzen, wenn er auf einen geheimen Link klickt, den ich an seine E-Mail-Adresse sende. Ich möchte jedoch diese Lösung so modifizieren, dass nach dem Passwort-Reset-Workflow erfolgreich abgeschlossen ist, der Benutzer ist automatisch angemeldet, ohne ihre Benutzername erneut eingeben müssen und (neu) Passwort. Ich möchte dies tun, um die Erfahrung des Benutzers so reibungslos wie möglich zu machen.

Das Problem ist, ich weiß nicht, wie diese Arbeit zu machen, ohne dass der Benutzer erneut eingeben ihr Passwort (oder es in Klartext in der DB zu speichern, die offensichtlich sehr schlecht). Unten ist die aktuelle Art, wie ich das JWT-Token bekomme. Sie können sehen, dass ich in Zeile 12 das eindeutige Passwort des Benutzers brauche. Ich habe es nicht. Ich habe nur das verschlüsselte Passwort in my_user.password gespeichert.

Wie kann ich das verschlüsselte Passwort in my_user.password anstelle des eindeutigen Passworts verwenden, um den JWT zu erhalten? Wenn ich es nicht verwenden kann, wie wird dieser Workflow dann mit dem Rest Framework JWT erreicht?

from rest_framework_jwt.views import ObtainJSONWebToken 
from rest_framework status 
from django.contrib.auth.models import User 

my_user = User.objects.get(pk=1) 
ojwt = ObtainJSONWebToken() 

if "_mutable" in dir(request.DATA): 
    mutable = request.DATA._mutable 
    request.DATA._mutable = True 
request.DATA['username'] = my_user.username 
request.DATA['password'] = "<my_user's clear password>" 
if "_mutable" in dir(request.DATA): 
    request.DATA._mutable = mutable 


token_response = ojwt.post(request) 
if status.is_success(token_response.status_code): 
    # Tell the user login succeeded!! 
else: 
    # Tell the user login failed. 
    # But hopefully, this shouldn't happen 

Antwort

19

Wenn mit Django REST-Framework JWT arbeitet, wird erwartet, dass es in der Regel, dass der Benutzer auf ihre eigenen das Token generiert. Da Sie das Token im Auftrag des Benutzers generieren, können Sie keine der Standardansichten verwenden, um es funktionsfähig zu machen.

Sie werden das Token auf eigene Faust, ähnlich wie how DRF JWT does it in den Ansichten müssen erzeugen. Das bedeutet für Ihre Ansicht Code so etwas wie die folgenden mit

from rest_framework_jwt.settings import api_settings 
from datetime import datetime 


jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

my_user = User.objects.get(pk=1) # replace with your existing logic 

payload = jwt_payload_handler(my_user) 

# Include original issued at time for a brand new token, 
# to allow token refresh 
if api_settings.JWT_ALLOW_REFRESH: 
    payload['orig_iat'] = timegm(
     datetime.utcnow().utctimetuple() 
    ) 

return { 
    'token': jwt_encode_handler(payload) 
} 

Dies sollte Ihnen ermöglichen, manuell das Token innerhalb der Ansicht zu erzeugen, ohne das Kennwort des Benutzers zu kennen.

+0

Terrific Antwort! Vielen Dank. Ich habe eine kleine Änderung vorgenommen: Eine Importanweisung fehlt. –

+0

Vielen Dank für diesen Kevin. Deine Antwort trifft den Punkt! Es ist besonders nützlich, wenn Sie OAuthing auf Mobilgeräten ausführen und eine API verwenden, die mit einem Token geschützt ist. Ich habe Python Social Auth + DRF + JWT integriert – msaad

+1

Für alle Probleme, bekommen dies funktioniert [hier] (https://codepal.herokuapp.com/how-to-add-facebook-login-to-django-using -json-web-tokens /) ist ein Schritt-für-Schritt-Tutorial zur Implementierung von JWT-basierter Authentifizierung für Django-Apps. – dvc

Verwandte Themen