Регистрация подтвержденного пользователя по электронной почте и сброс пароля в 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:

  1. /register, который включает регистрационную форму и отправляет activation token email.
  2. /activate, который подтверждает activation token из электронного письма.
  3. /password reset, который включает форму забытого пароля и отправляет reset token email.
  4. /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Веб-APIPython и создайте 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-адреса.

Наконец, я оставлю вас с этим. Существуют встроенные шаблоны и представления для всех этих маршрутов, а также маршрутов входа и выхода. Их можно найти здесь. Однако этот процесс сильно абстрагирован, и я предпочитаю знать, что происходит, поэтому мы просто сделали все вручную. Спасибо Витору Фрейтасу за его руководство по процессу регистрации, особенно за генератор токенов.

Наслаждайтесь кодированием.