【发布时间】:2019-09-03 11:32:45
【问题描述】:
首先,我是django-rest-framework 的新手,如果我错了,请见谅。
我正在与django-rest-auth 和django-restframework-jwt 合作对用户进行身份验证。每次用户登录时,我都会在 localStorage 中保存 jwt 令牌。
我现在面临的问题是,当我在两个浏览器中使用相同的凭据登录,然后我在其中一个浏览器中更改密码时,另一个帐户仍然有效并且用户仍然可以导航和查看所有页面,即使密码已更改。
我想在他更改密码时使他的JWT 令牌无效,以便自动注销。但是我在official documentation of 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 的a similar post on SO 中发现了一条评论,指出
当用户更改令牌时使令牌失效的常用方法 密码是用他们密码的哈希值对令牌进行签名。因此,如果 密码更改,任何以前的令牌都会自动失败 核实。您可以通过包含 last-logout-time 将其扩展到注销 在用户的记录中并使用 last-logout-time 的组合 和密码哈希来签署令牌。这需要每个数据库查找 您需要验证令牌签名的时间,但大概您是 无论如何都要查找用户
我正在尝试实现它..如果它有效,我将更新我的帖子。 否则,我仍然愿意接受建议。
【问题讨论】:
标签: django-rest-framework jwt django-rest-auth django-rest-framework-jwt