如何在密码重置时撤销刷新令牌?
How to revoke refresh token on password reset?
我正在使用 django-rest-framework-simplejwt 来获取 access token
和 refresh token
。
问题是,如果我更改用户密码,refresh token
不会变得无效。基本上,即使用户更改了密码,我也可以继续发送 refresh token
并获得新的访问令牌。
我想要的是要求用户重新提交用户名和新密码以获得一对新的 access
和 refresh tokens
.
我该如何完成?
PS: 只是因为我很好奇,这不应该是库的默认行为吗?在什么情况下我们希望在凭据更改后保留 refresh token
?
我想出了如何让它工作。
我所做的是放置一个信号来跟踪任何所需参数是否已更改。如果是这样,它会将与该用户关联的所有刷新令牌列入黑名单。
这是代码:
First add 'rest_framework_simplejwt.token_blacklist'
in installed apps. Then:
@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, update_fields, **kwargs):
if not instance._state.adding: #instance._state.adding gives true if object is being created for the first time
existing_user = User.objects.get(pk=instance.pk)
if instance.password != existing_user.password or instance.email != existing_user.email or instance.username != existing_user.username:
# If any of these params have changed, blacklist the tokens
outstanding_tokens = OutstandingToken.objects.filter(user__pk=instance.pk)
# Not checking for expiry date as cron is supposed to flush the expired tokens
# using manage.py flushexpiredtokens. But if You are not using cron,
# then you can add another filter that expiry_date__gt=datetime.datetime.now()
for out_token in outstanding_tokens:
if hasattr(out_token, 'blacklistedtoken'):
# Token already blacklisted. Skip
continue
BlacklistedToken.objects.create(token=out_token)
这段代码基本上做的是,为用户获取所有未完成的令牌,然后将它们全部添加到黑名单。您可以在此处获得有关 outstanding/blacklisted 代币的更多信息。
https://github.com/davesque/django-rest-framework-simplejwt#blacklist-app
我正在使用 django-rest-framework-simplejwt 来获取 access token
和 refresh token
。
问题是,如果我更改用户密码,refresh token
不会变得无效。基本上,即使用户更改了密码,我也可以继续发送 refresh token
并获得新的访问令牌。
我想要的是要求用户重新提交用户名和新密码以获得一对新的 access
和 refresh tokens
.
我该如何完成?
PS: 只是因为我很好奇,这不应该是库的默认行为吗?在什么情况下我们希望在凭据更改后保留 refresh token
?
我想出了如何让它工作。
我所做的是放置一个信号来跟踪任何所需参数是否已更改。如果是这样,它会将与该用户关联的所有刷新令牌列入黑名单。
这是代码:
First add
'rest_framework_simplejwt.token_blacklist'
in installed apps. Then:
@receiver(signals.pre_save, sender=User)
def revoke_tokens(sender, instance, update_fields, **kwargs):
if not instance._state.adding: #instance._state.adding gives true if object is being created for the first time
existing_user = User.objects.get(pk=instance.pk)
if instance.password != existing_user.password or instance.email != existing_user.email or instance.username != existing_user.username:
# If any of these params have changed, blacklist the tokens
outstanding_tokens = OutstandingToken.objects.filter(user__pk=instance.pk)
# Not checking for expiry date as cron is supposed to flush the expired tokens
# using manage.py flushexpiredtokens. But if You are not using cron,
# then you can add another filter that expiry_date__gt=datetime.datetime.now()
for out_token in outstanding_tokens:
if hasattr(out_token, 'blacklistedtoken'):
# Token already blacklisted. Skip
continue
BlacklistedToken.objects.create(token=out_token)
这段代码基本上做的是,为用户获取所有未完成的令牌,然后将它们全部添加到黑名单。您可以在此处获得有关 outstanding/blacklisted 代币的更多信息。 https://github.com/davesque/django-rest-framework-simplejwt#blacklist-app