首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django: token使用后如何删除?

Django: token使用后如何删除?
EN

Stack Overflow用户
提问于 2018-03-12 18:45:13
回答 2查看 754关注 0票数 3

在Django中,我正在生成用于帐户激活的令牌。下面是实际的代码:

代码语言:javascript
复制
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': default_token_generator.make_token(user),

例如:

http://localhost:8000/reset/MjQ/4uf-785b6e83f11ac22b6943/

在上面的url中,MjQuid4uf-785b6e83f11ac22b6943token

账号激活码如下:

代码语言:javascript
复制
def activate_account(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = get_user_model().objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if (user is not None and default_token_generator.check_token(user, token)):
        user.is_active = True
        user.save()

    messages.add_message(request, messages.INFO, 'Account activated. Please login.')
    return redirect('login')

问题是,一旦它被使用,它仍然有效。但是,Django密码重置机制(password_reset_confirm()视图)会在令牌使用后以某种方式使其失效。我怎样才能做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2018-11-11 01:53:50

不存储令牌。它是基于以下条件的哈希值:

  • the user's password
  • the user's last login date

因此,当Django的密码重置确认实际上更改了密码时,令牌散列将自动失效。

如果要手动使散列无效,可以通过以下任一方法执行此操作:

为该用户生成并存储一个随机密码(如果您想保留该用户以前的密码,这可能不是您想要的):

代码语言:javascript
复制
password = User.objects.make_random_password()
user.set_password(password)

或者将用户的上次登录日期重置为当前时间戳

代码语言:javascript
复制
from django.utils import timezone
user.last_login = timezone.now()
票数 2
EN

Stack Overflow用户

发布于 2018-03-12 21:57:14

为什么要注意删除内容呢?最好使用在一段时间后自动过期的内容。

请参阅django.core.signing.TimestampSigner

https://docs.djangoproject.com/en/2.0/topics/signing/#verifying-timestamped-values

要获得更好的how-to,请参阅此page,我将只通过将生成的密钥包装在base64.urlsafe_b64encode(...)中,然后在取消base64.urlsafe_b64decode(...)签名之前对其进行扩展

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49233271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档