在Django中,我正在生成用于帐户激活的令牌。下面是实际的代码:
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': default_token_generator.make_token(user),例如:
http://localhost:8000/reset/MjQ/4uf-785b6e83f11ac22b6943/
在上面的url中,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()视图)会在令牌使用后以某种方式使其失效。我怎样才能做到这一点呢?
发布于 2018-11-11 01:53:50
不存储令牌。它是基于以下条件的哈希值:
因此,当Django的密码重置确认实际上更改了密码时,令牌散列将自动失效。
如果要手动使散列无效,可以通过以下任一方法执行此操作:
为该用户生成并存储一个随机密码(如果您想保留该用户以前的密码,这可能不是您想要的):
password = User.objects.make_random_password()
user.set_password(password)或者将用户的上次登录日期重置为当前时间戳
from django.utils import timezone
user.last_login = timezone.now()发布于 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(...)签名之前对其进行扩展
https://stackoverflow.com/questions/49233271
复制相似问题