【问题标题】:How to Create a Unique One Time Reset Password Link in Django?如何在 Django 中创建一个唯一的一次性重置密码链接?
【发布时间】:2019-11-11 16:53:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,我认为您的解决方案是个好主意 更好地实现您的想法是:

    在您的设置中添加以下内容:

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

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

    【讨论】:

    • 你能解释一下我应该如何在我的 urls.py 中实现路径吗?
    • 我应该向用户发送什么链接来重置他们的密码?在他们点击链接后如何重置密码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多