Как создать уникальную ссылку для одноразового сброса пароля в Django? - PullRequest
1 голос
/ 01 июля 2019

У меня есть Django веб-сайт, на котором пользователи могут зарегистрироваться и войти под своим номером телефона. Недавно я решил добавить на свой сайт пароль восстановления с номером телефона , я прочитал Просмотры аутентификации в Django , которые пользователи могут сбросить свой пароль, отправив им электронное письмо, но прежде всего это используйте электронную почту для сброса пароля, а во-вторых, используйте встроенные представления django, но я хочу, чтобы в моем представлении была функция, которая генерирует уникальную ссылку для одноразового сброса пароля, а затем я отправляю эту ссылку им с помощью своего sms api, чтобы они могли сбросить свой пароль, используя эта ссылка. Итак, как можно безопасно создать ссылку для сброса пароля? Единственная идея, которая у меня есть, - реализовать модель, которая хранит случайную строку с отношением OnetoOne и использует ее в качестве ссылки для сброса пароля.

1 Ответ

0 голосов
/ 01 июля 2019

Да, ваше решение - хорошая идея, я думаю, что лучшая реализация вашей идеи:

Добавьте в свои настройки следующее:

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

, поэтому нет необходимости использовать дополнительную таблицу для хранения токенов сброса

...