API: Аутентификация
API: Аутентификация
Базовый URL: /api/v1/auth
POST /auth/login
Вход в портал.
Тело запроса:
{ "login": "admin", "password": "admin_change_me", "authType": "local"}| Поле | Тип | Описание |
|---|---|---|
| login | string | Логин |
| password | string | Пароль |
| authType | local | 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.txtPOST /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_URL | URL сервера, напр. ldap://ldap:389 |
LDAP_BASE_DN | Базовый DN, напр. dc=portal,dc=local |
LDAP_BIND_DN | Service-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 >> .envdocker compose --profile ldap up -d --buildТестовый пользователь: ivanov / domain123.
Ошибки доменного входа:
400— LDAP не настроен401— неверный логин или пароль
См. также: directory.md