# JWT Аутентификация — AegisGuard API ## Схема работы - **access_token** — JWT, живёт 24 часа. Передаётся в заголовке `Authorization: Bearer`. - **refresh_token** — случайная строка, хранится в БД в виде хеша. Используется **один раз** (ротация): при запросе новой пары старый токен удаляется. - Регистрация сразу возвращает токены — отдельный логин не нужен. ## Эндпоинты ### POST /api/auth/register Создание аккаунта. ``` Запрос: { "username": "john", "email": "john@example.com", "password": "Secret123" } Ответ 201: { "token": "eyJhbGciOiJIUzI1NiIs...", "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4=", "user": { "id": "uuid", "username": "john", "email": "john@example.com", "created_at": "2026-06-13T12:00:00Z" } } ``` - `username` — 3–30 символов - `email` — валидный email - `password` — минимум 8 символов, обязательно заглавная + строчная + цифра Ошибки: `400` (валидация), `409` (email уже занят). ### POST /api/auth/login ``` Запрос: { "email": "john@example.com", "password": "Secret123" } Ответ 200: { "token": "...", "refresh_token": "...", "user": { ... } } ``` Rate limit: 10 попыток в минуту с одного IP (`429 Too Many Requests`). ### POST /api/auth/refresh Обновить токены по refresh_token. Старый удаляется, выдаётся новая пара. ``` Запрос: { "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4=" } Ответ 200: { "token": "...", "refresh_token": "...", "user": { ... } } ``` ### POST /api/auth/logout Удалить refresh_token из БД. ``` Запрос: { "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4=" } Ответ 200: { "message": "logged out successfully" } ``` ## Заголовок авторизации ``` Authorization: Bearer ``` ## Формат JWT ```json { "user_id": "uuid", "email": "john@example.com", "sub": "uuid", "exp": 1718000000, "iat": 1717913600 } ``` - `user_id` — UUID пользователя - `email` — Email пользователя - `sub` — то же, что `user_id` - `exp` — Unix-timestamp истечения токена - `iat` — Unix-timestamp выпуска токена ## Формат ошибок ```json { "error": "описание" } ``` - `400` — ошибка валидации - `401` — неверный email/пароль, токен протух или невалиден - `409` — email уже зарегистрирован - `429` — превышен лимит попыток логина - `500` — внутренняя ошибка сервера