> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yume.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Сброс пароля через OTP

> Трёхшаговый сброс забытого пароля по email: выдача одноразового кода с паузой и лимитами, проверка кода с выдачей временного токена на 5 минут и установка нового пароля.

Полный перечень полей — в [глоссарии](/ru/logic/user/password-reset-glossary).

## Что делает этот процесс

Сброс пароля позволяет пользователю, забывшему пароль, задать новый, подтвердив, что он владеет своим адресом электронной почты. Поскольку у пользователя один глобальный пароль (не зависящий от компании), после успешного сброса новый пароль действует во всех компаниях, где состоит этот человек.

Процесс разбит на три последовательных шага-запроса:

1. **Инициация сброса пароля** — пользователь вводит email, система отправляет на него одноразовый код.
2. **Проверка кода сброса** — пользователь вводит полученный код; при совпадении система выдаёт временный токен сброса.
3. **Подтверждение нового пароля** — пользователь присылает токен и новый пароль; система устанавливает пароль.

Каждый шаг — отдельный HTTP-запрос, и переход к следующему возможен только с результатом предыдущего (кодом, затем токеном).

<Info>
  Одноразовые коды выдаёт и проверяет единый **Сервис одноразовых кодов (OTP)**. Для сброса пароля код привязан к конкретному адресу электронной почты — для каждого адреса своя отдельная область хранения кода.
</Info>

## Шаг 1. Инициация сброса пароля

На вход принимается только **Email** (обязательное поле, проверяется формат адреса).

Дальнейшая логика:

* Система проверяет, существует ли пользователь с таким адресом.
* **Если пользователь найден** — Сервис одноразовых кодов выпускает новый код, привязанный к этому адресу, после чего письмо с кодом ставится в очередь фоновой отправки (тема письма — «Сброс пароля Yume!», отправляется и HTML-, и текстовая версия шаблона).
* **Если пользователь не найден** — не происходит ничего: код не выпускается, письмо не отправляется.

В обоих случаях ответ клиенту одинаковый — «Код отправлен» с успешным статусом.

<Note>
  Одинаковый ответ для существующего и несуществующего адреса сделан намеренно — чтобы по ответу нельзя было узнать, зарегистрирован ли адрес в системе (защита от перебора адресов).
</Note>

### Пауза между запросами кода

При выпуске кода Сервис одноразовых кодов соблюдает **Паузу между запросами** — новый код нельзя выпустить чаще, чем раз в 60 секунд. Если пользователь запрашивает код повторно слишком рано, срабатывает Ошибка паузы, и шаг инициации отвечает статусом «слишком много запросов» (429) с сообщением «Подождите минуту перед повторным запросом кода».

### Ограничение частоты запросов

У шага инициации собственный лимит частоты: **не более 5 запросов в минуту**. Он работает независимо от паузы между запросами кода и ограничивает частоту обращений к самому шагу.

## Шаг 2. Проверка кода сброса

На вход принимаются **Email** и **Код OTP** (ровно 6 символов).

Логика:

* Система обращается к Сервису одноразовых кодов и сверяет присланный код с сохранённым для этого адреса.
* **При неверном или отсутствующем коде** возвращается ошибка «Неверный код».
* **При верном коде** генерируется **Токен сброса** — случайный уникальный идентификатор — и сохраняется в кэше (привязанным к этому адресу) на 300 секунд (5 минут). Токен возвращается клиенту.

<Warning>
  При успешной проверке код «сжигается» — Сервис одноразовых кодов удаляет его сразу после совпадения. Повторно использовать тот же код нельзя; для новой попытки понадобится запросить код заново.
</Warning>

### Что проверяет сам сервис при сверке кода

При сверке Сервис одноразовых кодов выполняет несколько проверок в следующем порядке:

| Условие                                                      | Поведение                                                                               |
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
| Кода для этого адреса нет (истёк или не выпускался)          | Проверка не пройдена                                                                    |
| Время жизни кода истекло (прошло больше 300 секунд)          | Код удаляется, проверка не пройдена                                                     |
| Достигнут максимум попыток (уже накоплено 5 неверных вводов) | Код удаляется, проверка не пройдена                                                     |
| Код не совпал                                                | Счётчик неверных попыток увеличивается, код сохраняется до конца своего исходного срока |
| Код совпал                                                   | Проверка пройдена, код удаляется                                                        |

<Info>
  Сравнение кода выполняется устойчивым к таймингу способом, а сам код — 6 случайных цифр. После пятой неверной попытки код блокируется: следующая проверка (даже с верным кодом) не пройдёт и код будет удалён — потребуется запросить новый.
</Info>

### Ограничение частоты запросов

У шага проверки свой лимит частоты: **не более 10 запросов в минуту**.

## Шаг 3. Подтверждение нового пароля

На вход принимаются **Токен сброса**, **Email** и **Новый пароль**.

Новый пароль проверяется по стандартным правилам (минимальная длина 8 символов плюс встроенные проверки — на распространённость, схожесть с данными пользователя и т.п.).

Логика:

* Система читает из кэша токен, сохранённый на шаге проверки для этого адреса.
* **Если токена нет или он не совпадает** с присланным — возвращается ошибка «Ссылка для сброса пароля недействительна или устарела».
* **Если токен совпал** — ищется пользователь по адресу. Если пользователь не найден, возвращается ошибка. Иначе новому паролю присваивается значение (с корректным хешированием), пользователь сохраняется.
* После успешной смены токен сброса удаляется из кэша, ответ — «Пароль успешно изменён».

<Warning>
  Токен сброса живёт 5 минут независимо от одноразового кода. Даже если пользователь помнит код, но не уложился в 5 минут после его проверки, шаг подтверждения ответит, что ссылка устарела — придётся начать заново с проверки кода.
</Warning>

## Итоговая схема таймингов и лимитов

| Параметр                      | Значение                                                       |
| ----------------------------- | -------------------------------------------------------------- |
| Длина одноразового кода       | 6 цифр                                                         |
| Время жизни кода              | 300 секунд (5 минут)                                           |
| Пауза между запросами кода    | 60 секунд                                                      |
| Максимум неверных вводов кода | 5, после чего код блокируется и сгорает при следующей проверке |
| Время жизни токена сброса     | 300 секунд (5 минут)                                           |
| Лимит шага инициации          | 5 запросов в минуту                                            |
| Лимит шага проверки           | 10 запросов в минуту                                           |
| Лимит шага подтверждения      | отсутствует                                                    |

<Note>
  Одноразовые коды и токены сброса хранятся в кэше, разделённом по компаниям. Это значит, что все три шага должны выполняться в контексте одной и той же компании — иначе выпущенный код или токен не будет найден на следующем шаге.
</Note>

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Сброс пароля через OTP" icon="book" href="/ru/logic/user/password-reset-glossary">
    Полный перечень полей и понятий процесса сброса пароля.
  </Card>

  <Card title="Пользователи и доступ" icon="user-lock" href="/ru/logic/user">
    Обзорная страница раздела: аккаунт, участие в компании, роли и права.
  </Card>

  <Card title="Проблемы и логические ошибки" icon="bug" href="/ru/logic/user/issues">
    Сводка известных проблем и логических ошибок всего модуля.
  </Card>

  <Card title="Аккаунт и участие в компании" icon="user" href="/ru/logic/user/model">
    Как аккаунт связан с телефоном, как устроено участие в компаниях и откуда берутся роли.
  </Card>

  <Card title="Вход в систему" icon="right-to-bracket" href="/ru/logic/user/login">
    По каким данным можно войти — телефон, логин или адрес почты — и откуда берутся права.
  </Card>

  <Card title="Сессии и срок действия входа" icon="key" href="/ru/logic/user/sessions">
    Сколько живёт вход, как он продлевается и когда потребуется войти заново.
  </Card>

  <Card title="Как система определяет вашу компанию" icon="route" href="/ru/logic/user/active-company">
    Определение компании по адресу сайта или по аккаунту и что делать, если компании ещё нет.
  </Card>

  <Card title="Профиль и управление сотрудниками" icon="id-card" href="/ru/logic/user/profile">
    Редактирование своего профиля, добавление сотрудников и назначение им ролей.
  </Card>

  <Card title="Вход через Google" icon="google" href="/ru/logic/user/google-login">
    Вход по аккаунту Google и связывание его с существующим профилем.
  </Card>

  <Card title="Уровни лояльности и карты" icon="star" href="/ru/logic/user/loyalty">
    Уровни лояльности клиентов и оформление их карт для Apple и Google Wallet.
  </Card>
</CardGroup>
