Аутентификация

API использует JWT-токены без состояния (stateless). Токен выдаётся при входе или регистрации и передаётся в каждом защищённом запросе.

Получение токена

Токен возвращается в поле data.token ответа эндпоинтов POST /auth/login и POST /auth/register. Это подписанный JWT (алгоритм HS256), внутри которого зашиты идентификатор пользователя, идентификатор школы и роль.

Содержимое токена (payload)
{
  "user_id": "8f3b1c2a-...",
  "tenant_id": "1b9d6bcd-...",
  "role": "admin",
  "exp": 1749600000
}
У суперадмина платформы tenant_id равен null — он работает над школами через эндпоинты /api/v1/admin/*.

Передача токена

Добавляйте токен в заголовок Authorization со схемой Bearer:

Заголовок
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Для запросов к данным школы (/api/v1/t/*) дополнительно нужен заголовок X-Tenant-Subdomain — см. Мультитенантность.

Срок действия и продление

  • Токен живёт фиксированное время (настраивается на сервере, по умолчанию 24 часа).
  • Отдельного refresh-токена нет — после истечения нужно повторно вызвать POST /auth/login.
  • Истёкший или недействительный токен даёт ответ 401 unauthorized.

Проверка текущего пользователя

Эндпоинт GET /auth/me возвращает профиль владельца токена и состояние биллинга школы. Используйте его, чтобы проверить валидность токена и получить роль.

cURL
curl https://api.edumentor.kz/api/v1/auth/me \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme"
Защита от перебора
Слишком частые неудачные попытки входа блокируются — POST /auth/login ответит 423 с сообщением too many attempts, try again later. Сообщение обобщённое и не раскрывает, существует ли аккаунт.