python - 使用 Rest-Framework-Jwt 创建 token

标签 python django django-rest-framework

我正在使用 rest-framework-jwt,只是想了解一些事情。

首先,我使用电子邮件和密码进行登录,并获得 token 。它运行良好。

但我也想在我的寄存器中创建一个 token 。所以,我使用这个函数:

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

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

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

但其次,我想创建仅包含电子邮件、密码和 uuid 的 token

第三...我的注册和登录中的 token 相同吗?要发出请求,它应该是相同的。

谢谢!

最佳答案

我找到了答案。

我读了这个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

就是这样

关于python - 使用 Rest-Framework-Jwt 创建 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623751/

相关文章:

python - Django 模板三元运算符

Django_Rest_Framework 序列化器字段 "source"属性不起作用

django-rest-framework - POST 上的 `validate()` 上未调用序列化程序 `is_valid()`

python - Django Rest Framework,使用MultiPartParser时Query Dict为空

python - 根据 2 个条件从数据框中删除行

python - 无法在 Google COLAB 上将我的 Dataframe 保存/导出为 CSV

Python .replace() 函数,以某种方式删除反斜杠

python - 无法弄清楚如何写入 csv

Django Rest Framework - 何时使用序列化器类与模型序列化器类的具体示例

python - 使用 channel 2 运行服务器时无法导入 ASGI_APPLICATION 模块