Django:如何在使用后删除令牌?

时间:2018-03-12 10:45:13

标签: django

在Django中,我正在为帐户激活生成令牌。这是实际的代码:

'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': default_token_generator.make_token(user),

例如:

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

在上面的网址MjQuid4uf-785b6e83f11ac22b6943token

帐户激活码如下:

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()视图)在使用它之后以某种方式使令牌无效。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

为什么要注意删除内容?使用一段时间后自动过期的东西要好得多。

请参阅django.core.signing.TimestampSigner

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

for nice how-to请参阅此page我只会通过将生成的密钥包装在base64.urlsafe_b64encode(...)中然后在取消签名base64.urlsafe_b64decode(...)

之前对其进行扩展

答案 1 :(得分:0)

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

  • 用户密码

  • 用户的上次登录日期

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

如果您想手动使哈希无效,可以通过以下任一方法来实现:

为该用户生成并存储一个随机密码(可能不是    如果要保留用户的先前密码,该怎么做?

password = User.objects.make_random_password()
user.set_password(password)

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

from django.utils import timezone
user.last_login = timezone.now()