2017-01-12 5 views
1

Я использую rest-framework-jwt и просто хочу знать несколько вещей.Создание токена с Rest-Framework-Jwt

Во-первых, я делаю логин с электронной почтой и паролем, и я получаю токен. Это работает хорошо.

но я также хочу создать токен в своем регистре. поэтому я пользуюсь этой функцией:

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 

Проблема в том, что у меня нет имени пользователя. Таким образом, это не сработает. :) Я думал, что если он работает с логином, он должен работать с регистром. Но нет. : smiley:

Даже если бы я написал это USERNAME_FIELD = 'email' в моей модели. Он всегда запрашивает имя пользователя в моей функции create_token.

Но второй, я хотел бы создать маркер с помощью только электронной почты, пароль и UUID

И третий ... Это же токен из моего реестра и от моего входа в систему? Чтобы делать запросы, они должны быть одинаковыми.

Спасибо!

ответ

1

Я нашел ответ.

Я прочитал это doc и понял, что мне просто нужно переопределить эти функции. В моем случае, я предпочел, чтобы переопределить jwt_playload_handler

Итак, я добавил функцию в файл с именем utils.py, и это выглядит так:

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 

, а затем, в settings.py

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

, чтобы сказать, что он должен выполнять мою функцию.

и в моих взглядах:

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 

это все

+0

Вы спасатель жизни. Спасибо! – NightFury

+0

Рад помочь :) –

Смежные вопросы