在Django中,我正在为帐户激活生成令牌。这是实际的代码:
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': default_token_generator.make_token(user),
例如:
http://localhost:8000/reset/MjQ/4uf-785b6e83f11ac22b6943/
在上面的网址MjQ
中uid
而4uf-785b6e83f11ac22b6943
是token
。
帐户激活码如下:
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()
视图)在使用它之后以某种方式使令牌无效。我怎么能这样做?
答案 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()