Appearance
Забыл пароль / Сброс пароля — все responses бэкенда
POST /auth/forgot-password
Поля запроса:
json
{
"email": "user@example.com"
}Успех — 200 OK
json
{
"data": {
"sent": true
}
}Всегда возвращает "sent": true — даже если email не найден в базе (защита от перебора аккаунтов). Если email существует — отправляется письмо с токеном сброса (TTL 1 час).
Ошибки
CSRF — 422
Формат: { "error": { "code": "validation_error", "message": "Validation failed", "details": { "csrf": ["..."] } } }
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
CSRF token is required | Нет CSRF-токена | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
CSRF token mismatch | Токен не совпадает | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
Invalid CSRF token | Невалидная подпись | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
Content-Type — 400
| Backend message | Текст для фронта (RU) |
|---|---|
Content-Type must be application/json or multipart/form-data | Произошла техническая ошибка. Попробуйте ещё раз |
Rate limit — 429
Лимит: 3 запроса на email за 1 час (sliding window).
Заголовки: Retry-After, X-RateLimit-Limit: 3, X-RateLimit-Remaining, X-RateLimit-Reset
| Backend message | Текст для фронта (RU) |
|---|---|
Too many requests | Слишком много запросов. Подождите и попробуйте снова |
Валидация полей — 422
Формат: { "error": { "code": "validation_error", "message": "Validation failed", "details": { "<field>": ["..."] } } }
body
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
Request body must be valid JSON | Тело запроса не JSON | Произошла техническая ошибка. Попробуйте ещё раз |
email
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
Field "email" is required and must be a non-empty string | Отсутствует / пустой | Введите email |
Field "email" must be a valid email address | Невалидный формат | Введите корректный email |
Серверная ошибка — 500
| Backend message | Текст для фронта (RU) |
|---|---|
Internal server error | Произошла ошибка на сервере. Попробуйте позже |
Маппинг error code → действие фронта
error.code | HTTP | Действие фронта |
|---|---|---|
validation_error | 422 | Показать ошибки под полем email из details |
rate_limit_exceeded | 429 | Показать toast, заблокировать кнопку на Retry-After секунд |
unsupported_media_type | 400 | Показать общую ошибку (техническая) |
internal_error | 500 | Показать общую ошибку |
POST /auth/reset-password
Поля запроса:
json
{
"token": "abc123def456...",
"password": "NewSecurePass1!"
}Токен приходит из ссылки в email (обычно как query-параметр на фронте).
Успех — 200 OK
json
{
"data": {
"reset": true
}
}Побочные эффекты: пароль обновлён, токен помечен как использованный, failed_login_attempts сброшен, locked_until снят.
Ошибки
CSRF — 422
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
CSRF token is required | Нет CSRF-токена | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
CSRF token mismatch | Токен не совпадает | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
Invalid CSRF token | Невалидная подпись | Ошибка безопасности. Перезагрузите страницу и попробуйте снова |
Content-Type — 400
| Backend message | Текст для фронта (RU) |
|---|---|
Content-Type must be application/json or multipart/form-data | Произошла техническая ошибка. Попробуйте ещё раз |
Валидация полей — 422
Формат: { "error": { "code": "validation_error", "message": "Validation failed", "details": { "<field>": ["..."] } } }
body
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
Request body must be valid JSON | Тело запроса не JSON | Произошла техническая ошибка. Попробуйте ещё раз |
token
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
Field "token" is required and must be a non-empty string | Отсутствует / пустой | Ссылка для сброса пароля повреждена. Запросите новую |
Invalid or expired reset token | Токен не найден, истёк (>1 час) или уже использован | Ссылка для сброса пароля недействительна или истекла. Запросите новую |
password
| Backend message | Когда | Текст для фронта (RU) |
|---|---|---|
Field "password" is required and must be a non-empty string | Отсутствует / пустой | Введите новый пароль |
Password must be at least 8 characters | Менее 8 символов | Пароль должен содержать минимум 8 символов |
Password must not exceed 128 characters | Более 128 символов | Пароль не должен превышать 128 символов |
Password must contain at least 1 uppercase letter | Нет заглавной буквы | Пароль должен содержать хотя бы одну заглавную букву |
Password must contain at least 1 lowercase letter | Нет строчной буквы | Пароль должен содержать хотя бы одну строчную букву |
Password must contain at least 1 digit | Нет цифры | Пароль должен содержать хотя бы одну цифру |
Password must contain at least 1 special character | Нет спецсимвола | Пароль должен содержать хотя бы один спецсимвол (!@#$%^&* и т.д.) |
Password must not contain 3 or more repeated characters | aaa, 111 и т.п. | Пароль не должен содержать три и более одинаковых символа подряд |
Password must not contain 3 or more sequential characters | abc, 123, xyz | Пароль не должен содержать три и более последовательных символа (abc, 123) |
Password is too common | Из списка популярных паролей | Этот пароль слишком простой. Придумайте другой |
Password must not contain the email local part | Пароль содержит часть email до @ | Пароль не должен содержать часть вашего email |
Несколько password-ошибок могут прийти одновременно в одном массиве.
Серверная ошибка — 500
| Backend message | Текст для фронта (RU) |
|---|---|
Internal server error | Произошла ошибка на сервере. Попробуйте позже |
Маппинг error code → действие фронта
error.code | HTTP | Действие фронта |
|---|---|---|
validation_error (token) | 422 | Показать сообщение о недействительной ссылке + кнопку «Запросить новую» |
validation_error (password) | 422 | Показать ошибки под полем пароля из details |
unsupported_media_type | 400 | Показать общую ошибку (техническая) |
internal_error | 500 | Показать общую ошибку |