Django 1.10密码重置生成的Token存储位置及查询问题
解决django-rest-auth密码重置Token找不到的问题
嘿,我之前在使用django-rest-auth实现密码重置功能时也碰到过一模一样的困惑!让我给你梳理清楚这里的关键点:
密码重置的Token根本不存储在数据库里!
Django自带的密码重置机制(django-rest-auth就是基于这个实现的)是通过签名生成Token的——它会把用户的ID、邮箱、最后登录时间等信息,结合你的项目SECRET_KEY进行加密签名,生成唯一的Token。验证的时候会重新生成签名和请求里的Token对比,所以完全不需要把Token存在数据库中,自然查不到记录。你查的两张表和密码重置Token无关:
authtoken_token:这是Django REST Framework的TokenAuthentication用的API认证Token,是用户登录后用来标识身份、访问受保护API的,和密码重置流程完全不搭边。account_emailconfirmation:这是django-allauth的邮箱确认Token,用于验证用户邮箱所有权,和密码重置不是同一个功能。
关于你提到的
token_model:
rest_auth/utils.py里的token_model指的是API认证用的Token模型(默认是rest_framework.authtoken.models.Token),和密码重置流程里的Token没有任何关系,别搞混啦。如果需要调试查看密码重置Token:
你可以手动用Django的工具生成看看,比如在shell里运行这段代码:from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes from django.contrib.auth import get_user_model User = get_user_model() user = User.objects.get(email="test@example.com") token_generator = PasswordResetTokenGenerator() reset_token = token_generator.make_token(user) uid = urlsafe_base64_encode(force_bytes(user.pk)) print(f"密码重置Token: {reset_token}") print(f"对应的UID: {uid}")
内容的提问来源于stack exchange,提问作者anyavacy
相关产品推荐
相关产品推荐

