Рекомендую такой вариант:
1. Пользователь запрашивает восстановление пароля
2. Шлём ему на почту письмо со специальной ссылкой, содержащей токен
3. Пользователь переходит по ссылке из письма
4. Сверяем токен, после чего авторизуем его и даем задать новый пароль
5. Сохраняем хеш пароля в БД
Тонкости:
— Токен — достаточно длинная строка из случайных символов
— У токена должен быть срок действия, например 1 час. Это обезопасит систему от перебора токенов