使用 Rest-Framework-Jwt 创建令牌

Chu*_*lar 3 python django django-rest-framework

我正在使用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
Run Code Online (Sandbox Code Playgroud)

问题是我没有用户名。所以,它不起作用。:) 我想,如果它适用于登录,它应该适用于注册。但不是。:笑脸:

即使我USERNAME_FIELD = 'email'在我的模型中写了这个。它总是在我的create_token函数中要求输入用户名。

但第二,我想用电子邮件、密码和 uuid 创建令牌

第三......我的注册和登录的令牌是否相同?要提出请求,它应该是相同的。

谢谢!

Chu*_*lar 6

我找到了答案。

我阅读了这个文档并意识到我只需要重新定义这些函数。就我而言,我更喜欢覆盖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
Run Code Online (Sandbox Code Playgroud)

然后,在settings.py

JWT_AUTH = {
    'JWT_PAYLOAD_HANDLER':
        'users.utils.jwt_payload_handler',
}
Run Code Online (Sandbox Code Playgroud)

说吧,它应该采取我的职能。

在我看来:

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
Run Code Online (Sandbox Code Playgroud)

就是这样