Восстановление пароля. Идея алгоритма

Курс по Django: https://stepik.org/a/183363

Архив проекта: 68_sitewomen.zip

На данный момент мы с вами научились делать авторизацию пользователей, регистрацию и изменение пароля. Осталось разобрать еще одно важное действие – это восстановление пароля. О чем здесь речь? Я, думаю, вы все неоднократно видели на формах авторизации ссылку с вопросом «Забыли пароль?» и, скорее всего, даже пользовались ей. Она позволяет нам создать новый пароль для своего аккаунта в случаях, когда мы его забываем. И это не редкая ситуация. Поэтому на любом более-менее серьезном сайте должна быть возможность восстановления пароля и на этом занятии мы познакомимся с идеей этого механизма во фреймворке Django.

При нажатии на ссылку «Забыли пароль?» по маршруту password-reset открывается страница с указанием E-mail, связанного с аккаунтом пользователя. При нажатии на кнопку «Выслать» на электронный ящик отправляется письмо со ссылкой для восстановления пароля и осуществляется переход по маршруту password-reset/done/ с отображением информационного сообщения. Затем, в почтовом ящике пользователь должен открыть письмо и перейти по указанной одноразовой ссылке. Появляется страница с установкой нового пароля, который меняется, при нажатии на кнопку «Изменить пароль». После этого автоматически осуществляется переход по адресу password-reset/complete с отображением информационного сообщения успешного изменения пароля.

Вот такая нетривиальная последовательность действий выполняется для смены пароля. По сути, здесь предполагается, что если пользователь помнит свой E-mail адрес, связанный с аккаунтом и пароль доступа к ящику, значит, это тот самый пользователь и ему можно предоставить возможность для восстановления пароля.

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

Настройка консольного почтового бэкенда

В схеме восстановления пароля нужно иметь возможность отправлять письма пользователю с почтового ящика нашего сервиса (сайта). Обычно, почтовый сервер разворачивают совместно с обычным сервером, который отрабатывает скрипты сайта. Хотя, для эксперимента можно воспользоваться любым известным сторонним почтовым сервером, например, от компании Яндекс или Гугл. Но мало-мальски серьезный проект подразумевает использование собственного почтового сервера, так как в этом случае вы получаете полный контроль за его работой. Представьте, что у вас имеется интернет-магазин и вы используете почту Яндекса. По каким-либо причинам она вдруг стала заблокированной и клиенты враз перестали получать важные почтовые уведомления. И исправить это можно будет только созданием нового почтового аккаунта, что приведет к изменению и почтового адреса отправителя. Поэтому для надежности почтового сообщения со своими клиентами следует разворачивать собственный почтовый сервер и с него отправлять письма. Благо, делается это стандартными средствами, и ничего особенно сложного в этом нет.

Но пока в процессе разработки сайта мы с вами используем тестовый веб-сервер. И для задач тестирования приложения настроим фреймворк Django на отправку писем в консоль. На странице документации:

https://docs.djangoproject.com/en/4.2/topics/email/

подробно описаны функции отправки писем. А также приведены настройки различных почтовых бэкендов. В частности по ссылке:

https://docs.djangoproject.com/en/4.2/topics/email/#console-backend

мы видим описание параметра EMAIL_BACKEND для настройки консольного бэкенда. Для этого в файле настроек settings.py следует прописать этот параметр со значением:

EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

Обратите внимание, что по умолчанию используется SMTP backend и приведен набор его настроек для реального почтового сервера, работающего по протоколу SMTP. Позже мы с вами рассмотрим пример его использования. А пока оставим консольный бэкенд.

Давайте посмотрим, как он будет работать. Я войду в оболочку shell:

python manage.py shell

И с самого начала страницы документации «Sending email» скопирую строчку импортирования функции send_mail():

from django.core.mail import send_mail

А, затем, скопирую пример отправки письма этой функцией:

send_mail(
     "От Балакирева",
     "Поздравляем! Вы успешно прошли курс по Django.",
     "root@site.com",
     ["you@mail.com"],
)

Здесь же в консоли увидим следующее почтовое сообщение:

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
To: you@mail.com
Date: Sat, 08 Jul 2023 04:38:55 -0000
Message-ID: <168879113585.16272.11887720130122423793@COMP-135 >

Поздравляем! Вы успешно прошли курс по Django.

Как видим, консольный почтовый бэкенд успешно подключен и работает. В результате мы настроили проект и готовы на следующем занятии приступить непосредственно к реализации алгоритма восстановления пароля.

Курс по Django: https://stepik.org/a/183363

Видео по теме