Python 如何在不强制用户重新键入密码的情况下进行Django JSON Web令牌身份验证?

Python 如何在不强制用户重新键入密码的情况下进行Django JSON Web令牌身份验证?,python,django,django-rest-framework,jwt,Python,Django,Django Rest Framework,Jwt,我的Django应用程序使用进行身份验证。它工作得很好,非常优雅 然而,我有一个我正在努力构建的用例。我已经为“忘记密码”工作流编写了一个工作解决方案。我允许未经身份验证的用户在单击我发送到其电子邮件地址的秘密链接时重置密码。但是,我希望修改此解决方案,以便在成功完成密码重置工作流后,用户可以自动登录,而无需重新键入用户名和(新)密码。我想这样做是为了让用户的体验尽可能无摩擦 问题是,我不知道如何在不让用户重新键入密码(或将密码以明文形式存储在数据库中,这显然非常糟糕)的情况下实现这一点。下面是

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

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

问题是,我不知道如何在不让用户重新键入密码(或将密码以明文形式存储在数据库中,这显然非常糟糕)的情况下实现这一点。下面是我获取JWT令牌的当前方式。你可以在第12行看到,我需要用户的清晰密码。我没有。我只将加密密码存储在
my\u user.password

如何使用我的_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
从rest\u framework\u jwt.views导入获得的JSONWebToken
从rest\u框架状态
从django.contrib.auth.models导入用户
my_user=user.objects.get(pk=1)
ojwt=获取JSONWebToken()
如果dir(request.DATA)中有“_mutable”:
可变=请求。数据。\可变
request.DATA.\u mutable=True
request.DATA['username']=my_user.username

request.DATA['password']=“使用Django REST Framework JWT时,通常预期用户自己生成令牌。因为您是代表用户生成令牌,所以无法使用任何标准视图使其工作

您需要自己生成令牌,类似于视图中的令牌

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)
}

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

回答得很好!谢谢。我做了一个小编辑:缺少导入语句。非常感谢Kevin。您的回答很贴切!当您在移动设备上使用受API保护的wit时,它特别有用我集成了Python Social Auth+DRF+JWT,这是一个关于为Django应用程序实现基于JWT的Auth的分步教程。