API: forgot-password / reset-password #57

Closed
opened 2026-07-23 20:49:30 +03:00 by cursor-ai · 2 comments
Owner

Проблема

На Front в UX-backlog отложен forgot-password: нет Back API. Есть только смена пароля через PATCH /v1/user/me (нужны Bearer + current_password).

Цель

Неаутентифицированный сброс пароля: запрос по email → токен → установка нового пароля.

Варианты

A (рекомендуется)

  • POST /v1/forgot-password {email} → всегда 200 {message} (без enumeration)
  • POST /v1/reset-password {token, password}200; ошибки 404/410/400
  • Отдельная Mnesia-таблица password_reset (как verification, RAM, TTL 1h), не смешивать с email-verify
  • logic_email:send_password_reset/2 (stub io:format, как verification)
  • Admin: GET /v1/admin/users/:id/password-reset-token для stage/IFT
  • После reset: обновить password_hash, удалить токен, опционально revoke sessions
  • Только для active пользователей; pending/frozen — silent 200 на forgot

B — переиспользовать verification с полем purpose (меньше таблиц, риск путаницы с verify).

C — только admin «force set password» без публичного forgot (не закрывает UX Login).

Критерии приёмки (A)

  • Public forgot + reset endpoints + swagger/trails
  • Admin get-or-create reset token
  • eunit/CT на happy-path, expiry, unknown email, inactive use
  • Spec: EventHubBackSpec.md
  • Front — отдельной задачей после API
## Проблема На Front в UX-backlog отложен forgot-password: нет Back API. Есть только смена пароля через `PATCH /v1/user/me` (нужны Bearer + current_password). ## Цель Неаутентифицированный сброс пароля: запрос по email → токен → установка нового пароля. ## Варианты **A (рекомендуется)** - `POST /v1/forgot-password` `{email}` → всегда `200` `{message}` (без enumeration) - `POST /v1/reset-password` `{token, password}` → `200`; ошибки `404`/`410`/`400` - Отдельная Mnesia-таблица `password_reset` (как verification, RAM, TTL 1h), **не** смешивать с email-verify - `logic_email:send_password_reset/2` (stub io:format, как verification) - Admin: `GET /v1/admin/users/:id/password-reset-token` для stage/IFT - После reset: обновить `password_hash`, удалить токен, опционально revoke sessions - Только для `active` пользователей; pending/frozen — silent 200 на forgot **B** — переиспользовать `verification` с полем `purpose` (меньше таблиц, риск путаницы с verify). **C** — только admin «force set password» без публичного forgot (не закрывает UX Login). ## Критерии приёмки (A) - [ ] Public forgot + reset endpoints + swagger/trails - [ ] Admin get-or-create reset token - [ ] eunit/CT на happy-path, expiry, unknown email, inactive use - [ ] Spec: EventHubBackSpec.md - [ ] Front — отдельной задачей после API
cursor-ai added the Story label 2026-07-23 20:49:30 +03:00
cursor-ai self-assigned this 2026-07-23 20:49:30 +03:00
Author
Owner

Беру в работу после выбора варианта.

Рекомендую A: отдельные endpoints + таблица password_reset, stub email, admin token для стендов. Не смешивать с POST /v1/verify.

Жду подтверждение: A / B / C.

Беру в работу после выбора варианта. **Рекомендую A:** отдельные endpoints + таблица `password_reset`, stub email, admin token для стендов. Не смешивать с `POST /v1/verify`. Жду подтверждение: A / B / C.
Author
Owner

Готово (вариант A).

Что сделано

  • POST /v1/forgot-password — всегда 200 (без enumeration)
  • POST /v1/reset-password — {token, password} (≥8), отзыв refresh-сессий
  • Mnesia password_reset (RAM, TTL 1h), stub logic_email:send_password_reset/2
  • Admin GET /v1/admin/users/:id/password-reset-token для стендов
  • Spec: EventHubBackSpec + UX-BACKLOG

Тесты

  • eunit: logic_password_reset_tests, admin_handler_user_password_reset_token_tests — ok
  • CT: api_users_SUITE:user_test_password_reset — ok

Коммиты

  • EventHubBack 61816e1
  • EventHubSpec ea1f7e1

Front UI forgot/reset — отдельно.

Готово (вариант A). ## Что сделано - `POST /v1/forgot-password` — всегда 200 (без enumeration) - `POST /v1/reset-password` — `{token, password}` (≥8), отзыв refresh-сессий - Mnesia `password_reset` (RAM, TTL 1h), stub `logic_email:send_password_reset/2` - Admin `GET /v1/admin/users/:id/password-reset-token` для стендов - Spec: EventHubBackSpec + UX-BACKLOG ## Тесты - eunit: `logic_password_reset_tests`, `admin_handler_user_password_reset_token_tests` — ok - CT: `api_users_SUITE:user_test_password_reset` — ok ## Коммиты - EventHubBack `61816e1` - EventHubSpec `ea1f7e1` Front UI forgot/reset — отдельно.
Sign in to join this conversation.