2017-01-12 4 views
1

Ich benutze Rest-Framework-JWT und will nur ein paar Dinge wissen.Token Creation mit Rest-Framework-JWT

Zuerst mache ich die Anmeldung mit der E-Mail und das Passwort, und ich bekomme das Token. Es läuft gut.

aber ich möchte auch ein Token in meinem Register erstellen. also verwende ich diese Funktion:

def create_token(user): 
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

    payload = jwt_payload_handler(user) 
    token = jwt_encode_handler(payload) 

    return token 

Das Problem ist, dass ich keinen Benutzernamen habe. Also, es funktioniert nicht. :) Ich dachte, wenn es mit dem Login funktioniert, sollte es mit dem Register arbeiten. Aber nicht. : smiley:

Auch wenn ich dieses USERNAME_FIELD = 'email' in meinem Modell schrieb. Es fragt immer nach einem Benutzernamen in meiner create_token Funktion.

Zweitens aber würde Ich mag das Token nur mit dem E-Mail, Passwort erstellen, und

Und drittens uuid ... Ist das gleiche Token von meinem Register und aus meiner Anmeldung? Um die Anfragen zu stellen, sollte es dasselbe sein.

Vielen Dank!

Antwort

1

Ich fand die Antwort.

Ich lese diese doc und erkannte, dass ich nur diese Funktionen neu definieren müssen. In meinem Fall, ich jwt_playload_handler

Also, habe ich die Funktion in einer Datei namens utils.py und es sieht so außer Kraft zu setzen bevorzugt:

from calendar import timegm 
from datetime import datetime 

from rest_framework_jwt.compat import get_username_field 
from rest_framework_jwt.settings import api_settings 


def jwt_payload_handler(user): 
    username_field = get_username_field() 
    print(user['uuid']) 
    payload = {'user_id': user['uuid'], 'email': user['email'], 'username': user['email'], 
       'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA, username_field: user['email']} 

    # 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() 
     ) 

    if api_settings.JWT_AUDIENCE is not None: 
     payload['aud'] = api_settings.JWT_AUDIENCE 

    if api_settings.JWT_ISSUER is not None: 
     payload['iss'] = api_settings.JWT_ISSUER 

    return payload 

und dann im settings.py

JWT_AUTH = { 
    'JWT_PAYLOAD_HANDLER': 
     'users.utils.jwt_payload_handler', 
} 

um es zu sagen, dass es meine Funktion übernehmen sollte.

und in meinen Ansichten:

def create_token(user): 
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

    payload = jwt_payload_handler(user) 
    token = jwt_encode_handler(payload) 

    return token 

, die es

+0

Sie ist ein Lebensretter. Vielen Dank! – NightFury

+0

Froh zu helfen :) –