Перейти к содержимому

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

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

Базовый URL: /api/v1/auth

POST /auth/login

Вход в портал.

Тело запроса:

{
"login": "admin",
"password": "admin_change_me",
"authType": "local"
}
ПолеТипОписание
loginstringЛогин
passwordstringПароль
authTypelocal | domainТип учётной записи

Ответ 200:

{
"success": true,
"data": {
"user": {
"id": "uuid",
"login": "admin",
"display_name": "Администратор портала",
"is_portal_admin": true
},
"token": "eyJ...",
"expiresIn": 900
}
}

JWT также устанавливается в httpOnly cookie portal_token. expiresIn — оставшееся время жизни в секундах; expiresAt — unix timestamp истечения. maxExpiresIn — полный срок из JWT_EXPIRES_IN.

Ошибки:

  • 401 — неверный логин или пароль
  • 400 — ошибка валидации
  • 429 — превышен лимит попыток (10/мин)

Пример curl:

Окно терминала
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"login":"admin","password":"admin_change_me","authType":"local"}' \
-c cookies.txt

POST /auth/logout

Выход. Очищает cookie.

POST /auth/refresh

Продление сессии (sliding session). Требует действующий JWT в cookie.

Ответ 200:

{
"success": true,
"data": {
"token": "eyJ...",
"expiresIn": 900
}
}

Cookie обновляется автоматически. Фронтенд вызывает endpoint проактивно (~50% оставшегося TTL), при возврате на вкладку, при фокусе окна и после каждой загрузки страницы.

Ошибки:

  • 401 — сессия истекла или пользователь заблокирован

GET /auth/me

Текущий пользователь. Требует авторизации.

Ответ 200:

{
"success": true,
"data": {
"user": {
"id": "...",
"login": "admin",
"display_name": "...",
"email": "admin@portal.local",
"auth_source": "local",
"is_portal_admin": true,
"is_active": true,
"last_login_at": "...",
"created_at": "...",
"groups": [
{ "id": "uuid", "name": "Читатели портала" }
]
}
}
}

groups — группы доступа, в которых состоит пользователь (для назначения прав через группы).

Доменная авторизация (LDAP / AD)

При authType: "domain" портал проверяет логин и пароль через LDAP bind. Пароли доменных пользователей не хранятся в Postgres.

При первом успешном входе создаётся запись в users с auth_source=domain (JIT-provisioning). При повторном входе обновляются display_name и email.

Переменные окружения:

ПеременнаяОписание
LDAP_URLURL сервера, напр. ldap://ldap:389
LDAP_BASE_DNБазовый DN, напр. dc=portal,dc=local
LDAP_BIND_DNService-account для поиска
LDAP_BIND_PASSWORDПароль service-account
LDAP_USER_FILTERФильтр входа, плейсхолдер {{username}}
LDAP_SEARCH_FILTERФильтр поиска, плейсхолдер {{query}}
LDAP_LOGIN_ATTRАтрибут логина: sAMAccountName (AD) или uid (OpenLDAP)

Локальный LDAP для разработки:

Окно терминала
cat docker/ldap/.env.example >> .env
docker compose --profile ldap up -d --build

Тестовый пользователь: ivanov / domain123.

Ошибки доменного входа:

  • 400 — LDAP не настроен
  • 401 — неверный логин или пароль

См. также: directory.md