Мой процесс выглядит следующим образом.
1. Пользователь инициирует запрос забытого пароля
Пользователь нажимает ссылку забытого пароля, а затем перенаправляется в форму сброса пароля, где ему предлагается ввести зарегистрированный адрес электронной почты.
2. Адрес электронной почты подтвержден и сгенерирован токен
После того, как пользователь ввел свой адрес электронной почты, система проверяет его наличие в базе данных. Если адрес электронной почты действителен, токен генерируется и сохраняется в базе данных с учетными данными пользователя.
3. Отправить письмо для восстановления
На зарегистрированный адрес электронной почты отправляется электронное письмо со ссылкой на форму сброса, ссылка содержит 2 параметра GET, включая токен и уникальный идентификатор пользователя, хранящийся в базе данных.
4. Сбросить пароль
После того, как пользователь щелкнет ссылку, он будет переведен в форму сброса. Система извлекает 2 параметра GET из URL и проверяет их наличие в базе данных. Если подтверждается, что токен существует в базе данных с пользователем, то пользователю может быть показан поля формы сброса пароля для ввода нового пароля.
Безопасность
Я предлагаю использовать BCrypt (доступен с PHP 5.3) для хэширования паролей и для дополнительной безопасности, возможно, использовать какой-то срок действия для токена, чтобы его нельзя было использовать через некоторое время.