如何在Django中创建唯一的一次性重置密码链接?

时间:2019-06-30 23:46:25

标签: django django-models django-views reset-password

我有 Django 网站,用户可以使用其电话号码进行注册和登录。 最近,我决定在网站上添加一个具有电话号码的恢复密码部分,我读过Authentication Views in Django,该用户可以通过向他们发送电子邮件来重置密码,但首先使用电子邮件来重置密码,其次它使用django内置视图,但是我想在视图中使用一个函数,该函数生成唯一的一次重置密码链接,然后使用我的sms api发送此链接给他们,以便他们可以使用此链接重置密码。 那么如何以安全的方式生成重置密码链接? 我唯一的想法是实现一个模型,该模型存储一个具有OnetoOne关系的随机字符串,并将其用作重置密码链接。

1 个答案:

答案 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']

因此无需使用额外的表来存储您的重置令牌