feat(auth): сервис аккаунтов и аутентификации Фазы 1

- регистрация: политика пароля (≥10 + локальный словарь 10k утечек, SecLists MIT),
  username и email без учёта регистра, шифрование email с привязкой к аккаунту,
  blind index для поиска, автовступление в главный сервер с ролью @user
- вход: Argon2id+pepper, TOTP при включённом 2FA, блокировка после серии неудач,
  события безопасности; единый ответ на неверный пароль и неизвестный аккаунт
- сессии: opaque-токены (в БД только SHA-256), ротация токена, logout/logout-all,
  отзыв остальных сессий при смене пароля, step-up с окном 10 минут
- 2FA: настройка секрета с QR-URL, подтверждение кодом, 8 резервных кодов
  (хранятся хэшами), обязательность для инстанс-админов, запрет отключения
- тесты на реальной SQLite: регистрация/вход/дубликаты, слабые и утёкшие пароли,
  ротация и logout-all, TOTP и резервные коды, step-up, смена пароля,
  выключенная регистрация, отсутствие секретов в логах
This commit is contained in:
2026-09-19 21:29:07 +03:00
parent a5205cc054
commit 16218ee045
10 changed files with 11294 additions and 24 deletions
+6
View File
@@ -41,6 +41,12 @@ Copyright (C) 2026 glchat contributors.
`web/package.json`/`web/package-lock.json`. Совместимость лицензий с AGPL-3.0
проверяется при добавлении каждой зависимости (AGENT.md §15).
## Данные
| Файл | Источник | Лицензия |
|---|---|---|
| `internal/auth/data/leaked-passwords.txt` | [SecLists](https://github.com/danielmiessler/SecLists) `Passwords/Common-Credentials/10k-most-common.txt` | MIT |
## Ассеты
Встроенные звуки, иконки и изображения — только CC0, собственные или