109 lines
2.9 KiB
Markdown
109 lines
2.9 KiB
Markdown
# 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 <access_token>
|
||
```
|
||
|
||
## Формат 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` — внутренняя ошибка сервера
|