/api/v1/authAuth model: JWT с audience public для protected routes
Response envelope: формат ответа A (см. api-overview.html)
Authorization: Bearer <token>, audience=public/token/refresh и опционально в /logoutBearer, поле expires_in — секунды до истечения access token---
Регистрация публичного пользователя.
Auth: None
Request body:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
username | string | да | 3–64 символа |
email | string | да | max 128 |
password | string | да | min 8, max 128 |
consent_pd | boolean | нет | согласие на обработку ПД |
consent_version | string | нет | версия политики, max 64 |
Responses:
| Код | Описание |
|---|---|
| 201 | { "success": true, "data": {...} } |
| 422 | validation_error |
| 409 | email_already_exists, username_already_exists |
| 403 | registration_disabled, consent_required |
---
Вход, выдача пары JWT.
Auth: None
Request body:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
username | string | да | |
password | string | да | |
mfa_code | string | нет | TOTP при включённом MFA |
Response 200 — data:
| Поле | Тип | Описание |
|---|---|---|
access_token | string | JWT access |
токен обновления | string | JWT refresh |
token_type | string | "Bearer" |
expires_in | int | TTL access token (сек) |
mfa_required | bool | true если нужен второй фактор |
Error codes: invalid_credentials, email_not_verified, account_locked, ip_locked, mfa_required, mfa_invalid, rate_limited, public_api_blocked
---
Подтверждение email по токену из письма.
Auth: None
Request body:
| Поле | Тип | Обяз. |
|---|---|---|
token | string | да (min 8) |
---
Профиль текущего пользователя.
Auth: токен доступа (JWT), audience=public
Response 200 — data (PublicUserProfile):
| Поле | Тип | Описание | |
|---|---|---|---|
id | int | ||
username | string | ||
email | string | ||
email_verified | bool | ||
pending_email | string \ | null | ожидает подтверждения |
role | string \ | null | |
permissions | string[] |
---
Обновление профиля или запрос смены email.
Auth: токен доступа (JWT), audience=public
Request (обновление username):
{ "username": "new_name" }
Request (смена email):
{ "email": "new@example.com" }
Если в body только email без username — трактуется как ChangeEmailRequest.
---
Смена пароля.
Auth: токен доступа (JWT), audience=public
Request body:
| Поле | Тип | Обяз. |
|---|---|---|
current_password | string | да |
new_password | string | да (min 8) |
Response 200: { "success": true, "message": "Password updated" }
---
Обновление пары JWT.
Auth: None (refresh token в body)
Request body:
| Поле | Тип | Обяз. |
|---|---|---|
токен обновления | string | да |
Response 200 — data (TokenPairResponse): access_token, токен обновления, token_type, expires_in
---
Выход, инвалидация токенов.
Auth: токен доступа (JWT) + optional refresh в body
Request body (optional):
| Поле | Тип | Описание |
|---|---|---|
токен обновления | string | для инвалидации refresh |
Response 200: { "success": true, "message": "Logged out" }
---
Инициализация MFA — secret и данные для QR.
Auth: токен доступа (JWT), audience=public
Response 200: { "success": true, "data": { "secret": "...", ... } }
---
Включение MFA после верификации TOTP-кода.
Auth: токен доступа (JWT), audience=public
Request body:
| Поле | Тип | Обяз. |
|---|---|---|
secret | string | да (из setup) |
code | string | да (TOTP) |
---
Отключение MFA.
Auth: токен доступа (JWT), audience=public
Request body:
| Поле | Тип | Обяз. |
|---|---|---|
current_password | string | да |
code | string | да (TOTP) |
---
| Code | HTTP | Описание |
|---|---|---|
validation_error | 422 | проверка формата данных validation |
invalid_credentials | 401 | Неверный login/password |
email_not_verified | 403 | Email не подтверждён |
account_locked | 403 | Аккаунт заблокирован |
ip_locked | 403 | IP заблокирован |
rate_limited | 429 | Rate limit (+ Retry-After) |
mfa_required | 401 | Требуется MFA code |
mfa_invalid | 401 | Неверный MFA code |
token_invalid | 401 | Невалидный token |
token_expired | 401 | Истёкший token |
registration_disabled | 403 | Регистрация отключена |
email_already_exists | 409 | Email занят |
username_already_exists | 409 | Username занят |
weak_password | 422 | Слабый пароль |
password_policy_violation | 422 | Политика паролей |
consent_required | 403 | Нужно согласие ПД |
service_unavailable | 503 | Auth service недоступен |
unauthorized | 401 | Нет/неверный JWT |