首先,我是新手,django-rest-framework
如果我错了,请原谅。
我正在与用户合作django-rest-auth
并django-restframework-jwt
对其进行身份验证。jwt
每次用户登录时,我都会将令牌保存在 localStorage 中。
我现在面临的问题是,当我在两个浏览器中使用相同的凭据登录,然后在其中一个浏览器中更改密码时,另一个帐户仍然有效,即使密码已更改,用户仍然可以导航和查看所有页面.
我想JWT
在他更改密码时使他的令牌无效,以便他自动注销。但我在官方文档中找不到让他的令牌过期的方法Django REST framework JWT
我试图通过为用户手动生成一个新的 JWT 令牌来跟踪更改密码的时刻,但这不起作用(可能是因为现有令牌仍然有效)
@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, **kwargs):
existing_user = User.objects.get(pk=instance.pk)
if getattr(settings, 'REST_USE_JWT', False):
if instance.password != existing_user.password:
# If user has changed his password, generate manually a new token for him
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(instance)
payload['orig_iat'] = timegm(datetime.utcnow().utctimetuple())
instance.token = jwt_encode_handler(payload)
在阅读了一些文档和帖子之后,这似乎并不容易,jwt
因为它是无国籍的,但是有人可以指出我要去哪里吗?
我应该删除JWT
身份验证吗?
是否有解决方法可以帮助我解决这个问题?
非常感谢。
编辑:
我在@Travis关于 SO 的类似帖子中发现了一条评论,指出
当用户更改密码时,使令牌失效的一种常用方法是使用密码的哈希对令牌进行签名。因此,如果密码更改,任何以前的令牌都会自动验证失败。您可以通过在用户记录中包含上次注销时间并使用上次注销时间和密码哈希的组合来对令牌进行签名,从而将其扩展到注销。每次您需要验证令牌签名时,这都需要进行数据库查找,但大概您正在查找用户
我正在尝试实现这一点。如果可行,我将更新我的帖子。否则,我仍然愿意接受建议。