feat: IAM API интеграция + обновление ТЗ + тесты
- src/auth.js: fetchIamUser(), switchProfile(), userFromPayload(iamData) - src/config.js: IAM_API_URL из env - src/routes/oidc.js: обогащение сессии через IAM (с fallback на JWT) - ui/routes/auth.js: обогащение при токен-логине - ui/routes/entries.js: switchTo через POST /switch-profile - src/api/routes/entries.js: resolveCompany через profiles[] - views/index.ejs: переключатель компаний с названиями из profiles - .env.example: IAM_API_URL - docs: обновлены ТЗ-реализация.md, ТЗ-плюс.md, добавлен iam-integration.md - tests: api-crud.sh (14 тестов CRUD + валидации) - .gitignore: исключены .env.test, DEPLOY-TESTING.md
This commit is contained in:
+12
-6
@@ -66,15 +66,21 @@ Self-service портал для указания клиентами довер
|
||||
|
||||
## 3.1. Принадлежность к компании
|
||||
|
||||
Принадлежность пользователя к компании определяется из claim токена. Поддерживается сценарий, когда пользователь принадлежит нескольким компаниям: в этом случае в интерфейсе предусматривается переключатель активной компании, а все операции выполняются в контексте выбранной компании.
|
||||
Принадлежность пользователя к компании определяется через IAM API (`GET /api/v1/auth/user`). Поддерживается сценарий, когда пользователь принадлежит нескольким компаниям: в этом случае в интерфейсе предусматривается переключатель активной компании, а все операции выполняются в контексте выбранной компании.
|
||||
|
||||
> **Реализация:** `src/auth.js` строка 245: `clientId = payload.ClientID`. `src/queries.js` строки 6–15: `getOrCreateCompany(clientId, companyName)` — атомарный upsert.
|
||||
> **Реализация:** `src/auth.js` — функция `fetchIamUser(token)` вызывает `GET {IAM_API_URL}/api/v1/auth/user`, получает `profiles[]` со всеми компаниями и `userInfo` с данными пользователя. `userInfo.isAdmin` — флаг админа (вместо хардкода `WZ01112`).
|
||||
>
|
||||
> ⚠️ **Сценарий нескольких компаний не реализован** — в реальном токене Nubes `ClientID` = одна строка, массива нет. Ждём уточнения от devops.
|
||||
> 🔧 **Требует доработки:** `fetchIamUser` ещё не реализована. Сейчас данные берутся из JWT (`payload.ClientID`). Правильный источник — IAM API.
|
||||
|
||||
Ожидаемые claims (имена согласуются с командой Keycloak):
|
||||
- `ClientID` — идентификатор компании → `src/auth.js` строка 245
|
||||
- `email` — идентификация пользователя для аудита → `src/auth.js` строка 248
|
||||
Ожидаемые данные из IAM API:
|
||||
- `profiles[].client_id` — все компании пользователя
|
||||
- `profiles[].is_active_profile` — активная компания
|
||||
- `profiles[].id` — ID профиля для `POST /switch-profile`
|
||||
- `userInfo.clientID` — WZ-код активной компании
|
||||
- `userInfo.company` — название компании
|
||||
- `userInfo.companyId` — UUID компании
|
||||
- `userInfo.isAdmin` — флаг администратора
|
||||
- `userInfo.email` — идентификация пользователя для аудита
|
||||
|
||||
# 4. Функциональные требования
|
||||
|
||||
|
||||
Reference in New Issue
Block a user