我正在使用 Django 简单 JWT 来实现用户身份验证,我做了一些调整,因此访问令牌和刷新令牌作为仅 http cookie 发送,一切正常
在前端,我实现了持久登录,当用户刷新页面或关闭浏览器等时,可以保持用户登录状态。
但是自从我启用了这些设置后:
"ROTATE_REFRESH_TOKENS": True,
"BLACKLIST_AFTER_ROTATION": True,
如果用户在很短的时间内不断刷新页面多次,可能会出现在用户收到新的刷新令牌之前令牌已被列入黑名单的情况
有办法解决这个问题吗? 一种可能的解决方法是禁用自动黑名单并等待前端在收到新的刷新令牌后发送请求,但我不确定其可靠性,该请求在其正文中包含旧的刷新令牌,如下所示
@api_view(['POST'])
def blacklist_token(request):
refreshToken = request.data.get("refresh")
print(refreshToken)
if refreshToken:
token = tokens.RefreshToken(refreshToken)
token.blacklist()
return Response(status=status.HTTP_200_OK)
PS:在前端使用React.js
据我了解,我明白了你的问题。
发生了什么:-
对于“BLACKLIST_AFTER_ROTATION”:正确
旧令牌被列入黑名单,并为每个请求创建新令牌。 因此,当您在短时间内快速刷新时,您会在收到新令牌之前多次请求同一页面。
因此,第一次请求旧令牌时将被列入黑名单,如果您使用旧密钥(已列入黑名单)再次请求,您将被阻止。
解决方案:-
1)
设定 “BLACKLIST_AFTER_ROTATION”:错误 忘记它吧。 所以你可以应对这种罕见的情况。
2)
“BLACKLIST_AFTER_ROTATION”:错误 和 延迟将旧密钥列入黑名单。就像60秒后一样。就像将它们添加到队列中一样。