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

时间:2014-12-17 15:59:51

标签: python django django-rest-framework jwt

我的Django应用程序使用Rest Framework JWT进行身份验证。它非常优雅,非常优雅。

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

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

如何使用my_user.password中的加密密码而不是清除密码来获取JWT?如果我无法使用它,那么如何使用Rest Framework JWT实现此工作流程?< / p>

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

1 个答案:

答案 0 :(得分:20)

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

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