Регистрация подтвержденного пользователя по электронной почте и сброс пароля в Django
Учебное пособие с подробным описанием маршрутов регистрации пользователя и сброса пароля для вашего приложения Django с проверкой электронной почты и генерацией уникального токена.
Это руководство предоставит вам все, что вам нужно знать, чтобы создать маршрут регистрации пользователя с подтверждением по электронной почте. Мы пройдем через процесс регистрации, генерации уникального токена и отправки электронных писем с помощью почтового клиента Sendgrid. Они предлагают бесплатный тариф до 100 писем в день. Мы также покажем вам, как создать маршрут для забытого пароля, где пользователи могут ввести свой адрес электронной почты, чтобы получить ссылку для сброса пароля.
Части приложения Django, которые мы рассмотрим, - это URL-адреса, представления проекта, генерация уникального токена, а также формы и модели регистрации. Структура нашего проекта выглядит так.
[projectname]/ ├── [projectname]/ ├── ├── templates/ │ │ ├── account/ │ │ ├── ├── activate_account_mail.html │ │ ├── ├── password_reset_conf.html │ │ ├── ├── password_reset_mail.html │ │ ├── ├── password_reset_req.html │ │ ├── ├── register.html │ ├── __init__.py │ ├── decorators.py │ ├── forms.py │ ├── models.py │ ├── settings.py │ ├── tokens.py │ ├── urls.py │ ├── views.py │ ├── wsgi.py └── manage.py
Регистрация и забытые пароли маршруты
Мы собираемся создать четыре конечных точки URL:
/register
, который включает регистрационную форму и отправляетactivation token email
./activate
, который подтверждаетactivation token
из электронного письма./password reset
, который включает форму забытого пароля и отправляетreset token email
./reset
, который подтверждаетreset token
из электронного письма.
Шаблоны форм
Нам понадобятся registration form
, password_request form
и password_change form
, которые позволят пользователям вводить новый пароль. Все формы будут выглядеть так же, как в приведенном ниже коде.
* Я расширяю base.html
файл, который содержит все мои теги таблиц стилей и скриптов, а также некоторые элементы HTML, такие как верхний и нижний колонтитулы веб-страницы. Чтобы получить представление о его содержании, взгляните на this Gist.
Шаблоны писем
Мы собираемся отправлять электронные письма с токенами подтверждения для активации учетных записей и сброса пароля. Шаблоны электронных писем будут выглядеть так, как показано ниже.
Код для account activation email
тот же, но текст в письме другой: «Чтобы активировать свою учетную запись, перейдите по ссылке ниже». Аргументы, которые вы видите в {{ brackets }}
, будут заполнены нашими взглядами.
Настройка электронной почты
Мы используем SendGrid в качестве почтового клиента, который позволяет нам отправлять 100 электронных писем в день бесплатно. Перейдите в Sendgrid, зарегистрируйте учетную запись и пройдите по тому же маршруту регистрации, что и тот, который мы строим здесь.
Перейдите к их руководству по интеграции и выполните следующие действия: Выполните интеграцию с помощью нашего веб-API или ретранслятора SMTP ›Веб-API› Python и создайте API ключ и следуйте инструкциям для проверки. Вы можете использовать переменные среды или config
файл * для ключей аутентификации.
* Я использую config.json
файл вне папки проекта и на своем производственном сервере, который состоит из словаря объектов ключей в формате JSON с ключами аутентификации для всех приложений, включая Sendgrid.
Формы
Шаблоны HTML-форм, которые мы создали ранее, представляют собой модели, которые мы храним в отдельном файле forms.py
. Мы импортируем встроенные в Django формы, такие как UserCreationForm
, как показано ниже.
Адаптация модели пользователя
Пользователи могут войти в систему только в том случае, если их адрес электронной почты подтвержден, и они не запрашивали сброс пароля с помощью кнопки забытого пароля. Чтобы реализовать эти функции, мы собираемся использовать пользовательскую модель пользователя. Мы добавим логическое поле email_confirmed
и логическое поле password_reset
.
- Если в поле
email_confirmed
указано Ложь, Пользователь не будет активен и не сможет войти в систему. - Если в поле
password_reset
указано Истина, Пользователь не будет активен и не сможет войти в систему.
* Обязательно перенесите модификации в модель User с помощью команд командной строки $ python3 manage.py makemigrations
и $ python3 manage.py migrate
.
Проверка токенов
Чтобы проверить токены, которые мы собираемся отправлять по электронной почте, мы будем использовать встроенный PasswordResetTokenGenerator
Django. Этот класс использует ряд компонентов в своем алгоритме хеширования, чтобы предотвратить его компрометацию.
- В проектах
SECRET_KEY
из настроек. На рабочем сервере важно сохранить этот ключ в секрете либо в переменных среды, либо в файле конфигурации. - Значение по умолчанию
PASSWORD_RESET_TIMEOUT_DAYS
3
дней. Если пользователь не сбросит пароль в течение трех дней, токен будет признан недействительным. - Хеш-значение состоит из первичного ключа пользователя и некоторого состояния пользователя, которое обязательно изменится после сброса пароля, чтобы создать токен, который становится недействительным при его использовании:
user PK
,user password hash
,user last login
иcurrent timestamp
для сравнения, чтобы проверитьPASSWORD_RESET_TIMEOUT_DAYS
. Мы будем реализовывать эту технику для нашего генератора токенов. SHA256
алгоритм хеширования, который преобразуется в 20-значноеhex
значение, которое вы и видите в URL.
Мы собираемся использовать этот метод для создания нашего собственного токена с логическими значениями, которые мы реализовали в нашей модели профиля. Для токена активации мы используем логическое поле email_confirmed
, которое изменяется по мере активации токена, в результате чего токен активации и его URL становятся недействительными.
Зарегистрируйтесь и активируйте
Пришло время собрать все это вместе в нашем views.py
. У нас есть четыре разных представления: (1) форма регистрации, (2) токен активации из электронного письма, (3) форма для сброса пароля и (4) токен сброса из электронного письма.
В строке 28 мы выполняем проверки формы и RECAPTCHA, подробнее об этом в рассказе ниже.
Теперь, когда мы отправили электронное письмо с URL-адресом для активации токена, нам нужно создать представление, которое проверяет токен.
Забыли пароль и сбросить
В форме входа пользователи могут нажать кнопку forgot password
и ввести свой адрес электронной почты, чтобы получить ссылку для сброса пароля.
Важно отметить, что НЕ ДОЛЖНО быть эксклюзивной обратной связи, основанной на том, соответствует ли адрес электронной почты адресу в базе данных. В противном случае злоумышленники смогут проверить все возможные адреса электронной почты, чтобы узнать, какие из них совпадают. Сообщение обратной связи: Если этот адрес электронной почты нам известен, на ваш счет будет отправлено электронное письмо.
Затем пользователи нажимают ссылку сброса и переходят к нашей конечной точке сброса URL-адреса.
Наконец, я оставлю вас с этим. Существуют встроенные шаблоны и представления для всех этих маршрутов, а также маршрутов входа и выхода. Их можно найти здесь. Однако этот процесс сильно абстрагирован, и я предпочитаю знать, что происходит, поэтому мы просто сделали все вручную. Спасибо Витору Фрейтасу за его руководство по процессу регистрации, особенно за генератор токенов.
Наслаждайтесь кодированием.