我有 Django 网站,用户可以使用其电话号码进行注册和登录。 最近,我决定在网站上添加一个具有电话号码的恢复密码部分,我读过Authentication Views in Django,该用户可以通过向他们发送电子邮件来重置密码,但首先使用电子邮件来重置密码,其次它使用django内置视图,但是我想在视图中使用一个函数,该函数生成唯一的一次重置密码链接,然后使用我的sms api发送此链接给他们,以便他们可以使用此链接重置密码。 那么如何以安全的方式生成重置密码链接? 我唯一的想法是实现一个模型,该模型存储一个具有OnetoOne关系的随机字符串,并将其用作重置密码链接。
答案 0 :(得分:0)
是的,我认为您的解决方案是个好主意 更好地实现您的想法是:
在您的设置中添加以下内容:
JWT_SECRET = SECRET_KEY # use settings secret key for JWT secret
JWT_ALGORITHM = 'HS256'
JWT_EXP_DELTA_SECONDS = 86400 # token expiring time in seconds let's assign one day
以下是对重置令牌进行编码和解码的功能:
from your_django_project import settings
from datetime import datetime, timedelta
import jwt
def encoded_reset_token(user_id):
payload = {
'user_id': user_id,
'exp': datetime.utcnow() + timedelta(seconds=settings.JWT_EXP_DELTA_SECONDS)
}
encoded_data = jwt.encode(payload, settings.JWT_SECRET, settings.JWT_ALGORITHM)
return encoded_data.decode('utf-8')
def decode_reset_token(reset_token):
try:
decoded_data = jwt.decode(reset_token, settings.JWT_SECRET,
algorithms=[settings.JWT_ALGORITHM])
except (jwt.DecodeError, jwt.ExpiredSignatureError):
return None # means expired token
return decoded_data['user_id']
因此无需使用额外的表来存储您的重置令牌