🎯 Назначение
Позволяет зарегистрированному пользователю Gratheon восстановить доступ к аккаунту при забытом пароле без обращения в поддержку и без раскрытия информации о том, зарегистрирован ли указанный email.
🎭 Пользовательская история
- Как пчеловод с аккаунтом Gratheon,
- я хочу сбросить пароль с экрана входа,
- чтобы безопасно вернуться к данным ульев, пасек и мониторинга при потере доступа.
🚀 Ключевые преимущества
- Самостоятельное восстановление: запрос сброса прямо со страницы входа.
- Подтверждение по email: на адрес аккаунта отправляется защищённая ссылка сброса.
- Защита приватности: экран запроса показывает общее сообщение об успехе и не раскрывает, существует ли email.
- Короткоживущие ссылки: ссылки сброса истекают через 1 час и работают только один раз.
- Защита от злоупотреблений: запросы ограничены по частоте, чтобы снизить спам и атаки на учётные записи.
- Понятные сообщения: для недействительных, просроченных или уже использованных ссылок показываются понятные подсказки.
🔧 Технический обзор
Восстановление пароля реализовано во frontend web-app и сервисе аутентификации user-cycle. Веб-приложение показывает ссылку «Forgot password?» на странице входа, форму запроса сброса и форму нового пароля, открываемую из письма. Backend генерирует криптографически стойкие токены сброса, хранит только их хеши, отправляет письмо, проверяет срок действия и одноразовость токена, а затем обновляет пароль пользователя.
📋 Критерии приёмки
- Ссылка «Forgot password?» доступна на экране входа.
- Пользователь может отправить email аккаунта для запроса ссылки сброса.
- Страница запроса возвращает общее сообщение об успехе и для существующих, и для несуществующих email.
- Система отправляет письмо со ссылкой сброса для зарегистрированных аккаунтов.
- Ссылка открывает страницу восстановления пароля с токеном.
- Пользователь может ввести и подтвердить новый пароль перед отправкой.
- Пароль обновляется после отправки действительного токена.
- Просроченные, недействительные или уже использованные токены отклоняются с понятным сообщением.
- Ссылки сброса истекают через 1 час и одноразовые.
- Запросы ограничены до 3 в день на пользователя/email/IP.
- Активные сессии остаются действительными после сброса пароля.
🚫 Вне области задачи
- Восстановление пароля для аккаунтов только с OAuth-входом через сторонние сервисы.
- Сброс пароля через поддержку.
- Принудительный выход из существующих сессий после сброса пароля.
- Восстановление при многофакторной аутентификации.
- Ручная проверка владения аккаунтом.
🏗️ Подход к реализации
- Frontend: со страницы входа ссылка на
/account/forgot-password; письма открывают/account/reset-password?token=.... - Backend:
user-cycleпредоставляет GraphQL-мутацииrequestPasswordReset(email)иresetPassword(token, password). - Безопасность: токены случайные, хешируются перед хранением, одноразовые, срок действия 1 час.
- Защита от злоупотреблений: ограничение частоты запросов по email, пользователю и IP.
- UX: общее сообщение об успехе запроса, проверка совпадения паролей, понятная обратная связь при недействительной ссылке.
📊 Метрики успеха
- Пользователи восстанавливают доступ без участия поддержки.
- Высокий процент завершения запроса сброса пароля.
- Ошибки недействительного или просроченного токена понятны пользователям.
- Нет перечисления аккаунтов через поток сброса пароля.
- Низкая частота повторных запросов с одной и той же идентичности.
🔗 Связанные функции
- 🧑🚀 Вход пользователя
- 🧑🚀 Регистрация пользователя
- 🧑🚀 Редактирование профиля пользователя
- 🌍 Локализация
📚 Ресурсы и ссылки
- Дизайн восстановления пароля в
web-app - GraphQL-схема
user-cycle - Страница запроса сброса в
web-app - Страница нового пароля в
web-app - Модель сброса пароля в
user-cycle
💬 Заметки
Эта функция входит в базовый жизненный цикл аккаунта. Она упрощает восстановление доступа для пчеловодов, защищает приватность и снижает злоупотребления ссылками сброса.
Последнее обновление: 23 июня 2026
Следующий пересмотр: июль 2026