Files
Control-plane/internal/auth/JWT_README.md
T
2026-06-13 18:31:22 +00:00

2.9 KiB
Raw Blame History

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 — 330 символов
  • 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 <access_token>

Формат JWT

{
  "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 выпуска токена

Формат ошибок

{ "error": "описание" }
  • 400 — ошибка валидации
  • 401 — неверный email/пароль, токен протух или невалиден
  • 409 — email уже зарегистрирован
  • 429 — превышен лимит попыток логина
  • 500 — внутренняя ошибка сервера