Аутентификация
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. Сообщение обобщённое и не раскрывает, существует ли аккаунт.