gpt4 book ai didi

python - 使用 django 和 JWT 在 N 分钟后重新登录

转载 作者:太空狗 更新时间:2023-10-30 01:36:10 26 4
gpt4 key购买 nike

场景:我希望用户在 N 分钟后经过安全敏感区域时重新登录,例如当用户要支付订单时,但是他在 1 小时前登录,我想确定是他。这通过使用 rest_framework_jwt

详细描述:

我最近一直在测试用于现代 Web 开发的 django(因此,后端带有 rest-api)。但是,我遇到了一个问题,我还没有找到解决办法。

rest_framework_jwt 中,您按如下方式设置身份验证类。

'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',

这对于通用目的来说将是一个很好的工作。但是,我希望用户在登录后 10 分钟进入具有敏感信息的区域时重新识别(重新登录),例如敏感信息可以是支付区。因此,我想向 Authentication 类发送一个参数,告知用户处于敏感区域。

我认为可能的解决方案是,但我还不知道该怎么做: rest_framework_jwt 在使用选项 时创建变量 orig_iat >JWT_ALLOW_REFRESH。我可以向身份验证类发送一个标志以告知当前 View 是否是敏感区域,如果是这样并且用户在 10 多分钟前登录,我可以发送一条消息说用户需要重新登录才能继续.

我不介意 fork rest_framework_jwt 项目并根据我的目的调整它,但是我想知道如何将参数从 View 发送到身份验证类(在本例中:rest_framework_jwt.authentication.JSONWebTokenAuthentication).

此外,如果已经针对这种情况使用 rest_framework_jwt 完成了一些工作,我想避免重新发明轮子。

最佳答案

嗯...到目前为止,我所做的是为函数 View 创建装饰器。装饰器的代码如下:

from functools import wraps
from rest_framework_jwt.settings import api_settings
from django.utils.translation import ugettext as _
from calendar import timegm
import datetime
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
def recently_authenticated():
def decorator(func):
@wraps(func)
def inner(request, *args, **kwargs):
jwt_payload = jwt_decode_handler(request._auth)
rencent_auth_limit = api_settings.JWT_RECENT_AUTHENTICATION_DELTA
if isinstance(rencent_auth_limit, datetime.timedelta):
rencent_auth_limit = (rencent_auth_limit.days * 24 * 3600 +
rencent_auth_limit.seconds) + jwt_payload["orig_iat"]
timenow = timegm(datetime.datetime.utcnow().utctimetuple())
if timenow>rencent_auth_limit:
return Response({"detail":_("you have to reidentify to enter this area")},
status=401)
return func(request, *args, **kwargs)
return inner
return decorator

响应格式以与 rest_framework_jwt.authentication.JSONWebTokenAuthentication 相同的格式给出。常量 JWT_RECENT_AUTHENTICATION_DELTA 是插入到 rest_framework_jwt 包(一个分支)的 settings.py 中的临时参数。

最后,为了使用它,可以将装饰器添加到任何 View 。例如:

@api_view()
@recently_authenticated()
def index_view(request):
data = User.objects.filter()
return Response(UserSerializer(data, many=True).data)

当用户刚刚通过身份验证时,它将发送消息{"detail":"you have to reidentify to enter this area"},代码为401。这可以由前端进行评估和解析,并将用户重定向到登录。

注意:装饰器只评估时间和耗时。 rest_framework_jwt.authentication.JSONWebTokenAuthentication 仍然执行验证它是否是正确的用户和正确的 token 。

关于python - 使用 django 和 JWT 在 N 分钟后重新登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com