【问题标题】:Token Creation with Rest-Framework-Jwt使用 Rest-Framework-Jwt 创建令牌
【发布时间】:2017-05-28 04:25:38
【问题描述】:

我正在使用 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

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

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

但其次,我想只使用电子邮件、密码和 uuid 创建令牌

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

谢谢!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案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
    

    就是这样

    【讨论】:

    • 你是一个救生员。谢谢!
    • 很高兴为您提供帮助:)
    猜你喜欢
    • 2019-08-01
    • 2017-06-25
    • 2017-03-30
    • 2019-06-20
    • 2019-02-26
    • 2020-06-18
    • 2016-08-24
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多