【问题标题】:How to do Django JSON Web Token Authentication without forcing the user to re-type their password?如何在不强制用户重新输入密码的情况下进行 Django JSON Web 令牌身份验证?
【发布时间】:2015-02-16 05:50:27
【问题描述】:

我的 Django 应用程序使用 Rest Framework JWT 进行身份验证。它工作得很好而且非常优雅。

但是,我有一个我正在努力构建的用例。我已经为“忘记密码”工作流程编写了一个可行的解决方案。当且仅当他们点击我发送到他们的电子邮件地址的秘密链接时,我允许未经身份验证的用户重置他们的密码。但是,我想修改此解决方案,以便在密码重置工作流程成功完成后,用户自动登录,而无需重新输入用户名和(新)密码。我想这样做是为了让用户的体验尽可能顺畅。

问题是我不知道如何在不让用户重新输入密码(或将其以明文形式存储在数据库中,这显然非常糟糕)的情况下完成这项工作。以下是我获取 JWT 令牌的当前方式。您可以在第 12 行看到,我需要用户的明文密码。我没有。我只有存储在my_user.password 中的加密密码。

如何使用 my_user.password 中的加密密码而不是明文密码来获取 JWT? 如果无法使用,那么如何使用 Rest Framework JWT 实现此工作流程?

from rest_framework_jwt.views  import ObtainJSONWebToken
from rest_framework status
from django.contrib.auth.models import User

my_user = User.objects.get(pk=1)
ojwt = ObtainJSONWebToken()

if "_mutable" in dir(request.DATA):
    mutable = request.DATA._mutable
    request.DATA._mutable = True
request.DATA['username'] = my_user.username
request.DATA['password'] = "<my_user's clear password>"
if "_mutable" in dir(request.DATA):
    request.DATA._mutable = mutable


token_response = ojwt.post(request)
if status.is_success(token_response.status_code):
     # Tell the user login succeeded!!
else:
     # Tell the user login failed.
     # But hopefully, this shouldn't happen

【问题讨论】:

    标签: python django django-rest-framework jwt


    【解决方案1】:

    使用 Django REST Framework JWT 时,通常希望用户自己生成令牌。因为您是代表用户生成令牌,所以您不能使用任何标准视图来使其工作。

    您将需要自己生成令牌,类似于视图中的how DRF JWT does it。这意味着为您的视图代码使用类似以下的内容

    from rest_framework_jwt.settings import api_settings
    from datetime import datetime
    
    
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
    my_user = User.objects.get(pk=1) # replace with your existing logic
    
    payload = jwt_payload_handler(my_user)
    
    # 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()
        )
    
    return {
        'token': jwt_encode_handler(payload)
    }
    

    这应该允许您在视图中手动生成令牌,而无需知道用户的密码。

    【讨论】:

    • 很好的答案!谢谢你。我做了一个小修改:缺少导入语句。
    • 非常感谢凯文。你的回答恰到好处!当您在移动设备上进行 OAuthing 并使用受令牌保护的 API 时,它特别有用。我已经集成了 Python Social Auth + DRF + JWT
    • 对于任何无法使其正常工作的人,here 是关于为 Django 应用实现基于 JWT 的身份验证的分步教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2016-02-01
    • 2019-05-10
    • 2017-06-24
    相关资源
    最近更新 更多