Добавление аутентификации логин/пароль #24

Closed
opened 2026-09-09 01:37:46 +03:00 by NotBigGhost · 2 comments
Owner

Нужно добавить вход в аккаунт через логин и пароль (телеграм остаётся как альтернативный вариант). Для новых пользователей предлагается основной вариант авторизации через логин с паролем, с возможностью прикрепить к нему телеграм. Должно быть два варианта поведения пользователя:
1: Пользователь создаёт аккаунт через телеграм, после чего приложение просит его придумать пароль для своего аккаунта. Логин - никнейм пользователя
2: Пользователь сначала вводит свой логин и пароль, регистрируясь в системе, после чего в настройках профиля при желании привязывает свой телегам аккаунт (ник при этом не меняется).

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

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

Нужно добавить вход в аккаунт через логин и пароль (телеграм остаётся как альтернативный вариант). Для новых пользователей предлагается основной вариант авторизации через логин с паролем, с возможностью прикрепить к нему телеграм. Должно быть два варианта поведения пользователя: 1: Пользователь создаёт аккаунт через телеграм, после чего приложение просит его придумать пароль для своего аккаунта. Логин - никнейм пользователя 2: Пользователь сначала вводит свой логин и пароль, регистрируясь в системе, после чего в настройках профиля при желании привязывает свой телегам аккаунт (ник при этом не меняется). Для уже существующих пользователей при входе на сайт должно всплывать окно с уведомлением (если мне память не изменяет, у нас уже есть готовое всплывающее окно), в котором просят ввести новый пароль для своего аккаунта. Сам по себе stub-вход уже реализован для дева, его просто нужно перенести на прод, изменив логику привязки к аккаунту под запрошенную выше, а следующей задачей убедиться в безопасности метода.
NotBigGhost added this to the 1.37 - смена аутентификации и смежный пен тест milestone 2026-09-09 01:37:46 +03:00
NotBigGhost added reference dev 2026-09-09 01:38:47 +03:00
NotBigGhost added a new dependency 2026-09-09 01:40:26 +03:00
NotBigGhost added
Priority
High
2
and removed
Priority
Critical
1
labels 2026-09-09 14:06:54 +03:00
NotBigGhost changed title from Смена аутентификации на логин/пароль to Добавление аутентификации логин/пароль 2026-09-09 14:08:21 +03:00
Agent self-assigned this 2026-09-13 13:24:25 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-13 13:24:26 +03:00
Collaborator

План выполнения

Stub-вход в прод не переносится. Он пускает по нику без секрета, а dev-код не должен попадать в прод-артефакт. Поэтому в прод-путь добавляется отдельный вход по паролю (backend/app/auth/password.py), stub остаётся только в dev. Колонка users.password_hash и провайдер local в схеме уже есть, миграция не нужна.

  1. Бэкенд, вход:
    • POST /api/auth/register и POST /api/auth/login (ник и пароль);
    • пароль от 8 символов и не больше 72 байт;
    • игроком входит только role='player';
    • при неизвестном логине сверка идёт с фиктивным хешем, ошибка одна на оба случая.
  2. Защита от перебора в памяти процесса: 5 неудач на пару «IP + логин» и 20 на IP за 15 минут, дальше 429 TOO_MANY_ATTEMPTS.
  3. Профиль:
    • PUT /api/users/me/password: если пароль уже задан, нужен текущий;
    • POST /api/users/me/telegram: привязка по подписи виджета, ник не меняется, занятый Telegram даёт 409;
    • в MeRead новое поле has_password.
  4. Админка: PUT /api/admin/users/{id}/password — задать пароль игроку. Это способ восстановить забытый пароль.
  5. Фронт:
    • страница входа: «Вход» и «Регистрация» по паролю, Telegram вторым способом;
    • обязательное окно «Задайте пароль» для всех без пароля, с кнопкой «Выйти»;
    • в профиле смена пароля и привязка Telegram;
    • в админке кнопка «Пароль».
  6. README: обновить таблицы методов входа.

Что ломается (Compat/Breaking)

  • Миграции нет, аккаунты и вход через Telegram сохраняются.
  • Каждый пользователь без пароля при первом заходе после выкладки должен задать пароль.
  • Ник становится логином: переименование меняет логин.
  • API меняется только добавлениями.
  • Откат образа безопасен: старый код password_hash игроков не читает.

Вне рамок, для пен-теста #25: отзыв JWT после смены пароля, throttle на входе админа, распределённый перебор, 2FA.

Критерии готовности

  • Регистрация и вход по нику и паролю работают в test и prod.
  • Игрок без пароля не может пользоваться сайтом, пока не задаст пароль; затем входит по нику и паролю.
  • Игрок с паролем привязывает Telegram и входит через него в тот же аккаунт с тем же ником.
  • Перебор ограничен (429), пароль админа не впускает игроком, stub не попадает в прод-образ.
  • pytest и npm run build зелёные.

Ветка: issue-24-login-password от dev

## План выполнения **Stub-вход в прод не переносится.** Он пускает по нику без секрета, а dev-код не должен попадать в прод-артефакт. Поэтому в прод-путь добавляется отдельный вход по паролю (`backend/app/auth/password.py`), stub остаётся только в dev. Колонка `users.password_hash` и провайдер `local` в схеме уже есть, миграция не нужна. 1. **Бэкенд, вход:** - `POST /api/auth/register` и `POST /api/auth/login` (ник и пароль); - пароль от 8 символов и не больше 72 байт; - игроком входит только `role='player'`; - при неизвестном логине сверка идёт с фиктивным хешем, ошибка одна на оба случая. 2. **Защита от перебора** в памяти процесса: 5 неудач на пару «IP + логин» и 20 на IP за 15 минут, дальше 429 `TOO_MANY_ATTEMPTS`. 3. **Профиль:** - `PUT /api/users/me/password`: если пароль уже задан, нужен текущий; - `POST /api/users/me/telegram`: привязка по подписи виджета, ник не меняется, занятый Telegram даёт 409; - в `MeRead` новое поле `has_password`. 4. **Админка:** `PUT /api/admin/users/{id}/password` — задать пароль игроку. Это способ восстановить забытый пароль. 5. **Фронт:** - страница входа: «Вход» и «Регистрация» по паролю, Telegram вторым способом; - обязательное окно «Задайте пароль» для всех без пароля, с кнопкой «Выйти»; - в профиле смена пароля и привязка Telegram; - в админке кнопка «Пароль». 6. **README:** обновить таблицы методов входа. **Что ломается (Compat/Breaking)** - Миграции нет, аккаунты и вход через Telegram сохраняются. - Каждый пользователь без пароля при первом заходе после выкладки должен задать пароль. - Ник становится логином: переименование меняет логин. - API меняется только добавлениями. - Откат образа безопасен: старый код `password_hash` игроков не читает. **Вне рамок, для пен-теста #25:** отзыв JWT после смены пароля, throttle на входе админа, распределённый перебор, 2FA. **Критерии готовности** - Регистрация и вход по нику и паролю работают в test и prod. - Игрок без пароля не может пользоваться сайтом, пока не задаст пароль; затем входит по нику и паролю. - Игрок с паролем привязывает Telegram и входит через него в тот же аккаунт с тем же ником. - Перебор ограничен (429), пароль админа не впускает игроком, stub не попадает в прод-образ. - `pytest` и `npm run build` зелёные. **Ветка:** `issue-24-login-password` от `dev`
Agent added the
Status
In Review
label 2026-09-13 14:13:55 +03:00
Collaborator

Работа выполнена, открыт PR: #53

Итог: вход по нику и паролю стал основным во всех окружениях, Telegram остался вторым способом.

  • Аккаунты без пароля (из Telegram и существующие) после входа видят обязательное окно «Задайте пароль».
  • В профиле смена пароля и привязка Telegram, ник при привязке не меняется.
  • Забытый пароль задаёт админ.
  • От перебора стоит защита (429). Stub в прод не переносился, миграции нет.

Проверки:

  • pytest — 128 passed, из них 26 новых.
  • npm run build зелёный, dev-строки в прод-бандл не попали.
  • curl на живом dev-бэкенде: регистрация, вход, 429 после 5 неудач.
  • Вёрстку в браузере не смотрел: расширение Chrome не было подключено. Привязку Telegram живьём не проверить на localhost.

Попутно: давняя ошибка — ответ 500 вместо 422 на тело не в JSON — вынесена в #52.

Статус: Status/In Review
Осталось за вами: ручной прогон форм входа, окна пароля и профиля, ревью и мёрж PR — задача закроется автоматически.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/53 **Итог:** вход по нику и паролю стал основным во всех окружениях, Telegram остался вторым способом. - Аккаунты без пароля (из Telegram и существующие) после входа видят обязательное окно «Задайте пароль». - В профиле смена пароля и привязка Telegram, ник при привязке не меняется. - Забытый пароль задаёт админ. - От перебора стоит защита (429). Stub в прод не переносился, миграции нет. **Проверки:** - `pytest` — 128 passed, из них 26 новых. - `npm run build` зелёный, dev-строки в прод-бандл не попали. - `curl` на живом dev-бэкенде: регистрация, вход, 429 после 5 неудач. - Вёрстку в браузере не смотрел: расширение Chrome не было подключено. Привязку Telegram живьём не проверить на localhost. **Попутно:** давняя ошибка — ответ 500 вместо 422 на тело не в JSON — вынесена в #52. **Статус:** `Status/In Review` **Осталось за вами:** ручной прогон форм входа, окна пароля и профиля, ревью и мёрж PR — задача закроется автоматически.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Blocks
#25 Пен тест
NotBigGhost/ForbiddenStarsApp
Reference: NotBigGhost/ForbiddenStarsApp#24