Каков лучший поток подтверждения электронной почты для пользователя и для приложения?
Некоторые варианты:
A) Самый простой вариант, но не самый лучший.- Пользователь отправляет форму регистрации.
- На бэкэнде я отправляю ссылку со случайным хэшем на электронную почту пользователя. Параллельно я сохраняю этого пользователя в db с полями active: false, и случайным хешем.
- Пользователь проверил почту, кликнул на ссылку.
- На бэкэнд я пытаюсь найти пользователя с хешем. Если пользователь найден в базе, меняю поле active на true.
Недостаток: что делать, если электронная почта не верна или произошла ошибка во время отправки? Я не могу адекватно отобразить ошибку пользователю.
B) Мы можем обрабатывать все ошибки и отображать их пользователю, но очень медленный вариант- Пользователь отправляет форму регистрации.
- На бэкэнде прежде всего я сохраняю этого пользователя в бд, затем отправляю ссылку со случайным хэшем на электронную почту пользователя и если письмо отправлено без ошибок, только тогда я отправляю ответ на клиент.
- Если произошла ошибка при отправке почты, я отправляю сообщение об ошибке пользователю, поэтому он знает, что письмо не отправлено.
- Вероятно, мне нужно удалить этого пользователя из бд, если случилась ошибка, чтобы он мог заново отправить форму регистрации (мейл уникальный)
Недостаток: Медленный процесс регистрации, много запросов к бд
C) Лучший вариант, я думаю- Пользователь отправляет форму регистрации.
- На бекенде я сохраняю пользователя в бд.
- Если сохранился в бд, я отправляю ответ пользователю и параллельно с этим отправляю ссылку на почту
- Пользователь получает ответ, если нет ошибок, перенаправляется на страницу, например. `/last-step` с текстом `проверьте вашу электронную почту...` Также на этой странице будет ссылка, которая позволит снова отправить подтверждение по электронной почте (например, каждые 3 минуты)
Вопрос №1. Как я могу распознать на бэкэнде, кто кликнул ссылку? Я так понимаю, что нужно хранить информацию на клиенте об этом пользователе. Где ее хранить? В куки? Насколько долго? В сессии?
Вопрос №2. Стоит ли ставить срок годности для этой ссылки? Если да, то что делать с юзерами, которые не подтвердили свой мейл. Удалять насовсем из бд?
UPD Вопрос №3 Что если отправлять на почту не страшную хеш ссылку, а просто код из 6 цифр? А на отдельной странице просить ввести этот код.