Files
ipwhitelist-app/docs/legacy-ТЗ-плюс.md
naeel a8a07fe019 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
2026-06-04 13:53:44 +03:00

8.4 KiB

ТЗ-плюс — уточнения и дополнения от заказчика

Основа: docs/ТЗ.md
Файл для фиксации уточнений, дополнений и решений по мере обсуждения с заказчиком/DevOps.
Каждая запись = дата + источник + формулировка + статус.


1. Аутентификация и Keycloak

1.1. client_id приложения в Keycloak

  • Дата: 2026-06-02
  • Источник: HAR-файл
  • Факт: client_id присутствует в URL auth-запроса
  • Статус: 🔴 требует подтверждения — какой client_id будет для ipwhitelist?

1.2. ClientID в JWT — УТОЧНЕНО

  • ТЗ: claim ClientID — идентификатор компании
  • Факт (HAR): ClientID: "WZ01325"
  • Факт (другой источник): ClientID может отсутствовать
  • Уточнение заказчика (01.06.2026): в claims приходит clientid. Формат может быть разный.
    • Одно значение: WZ04228, 1700, asokolov-test
    • Несколько через запятую: WZ11125, WZ03816, WZ52235, WZ62587, WZ02315
    • Логика: первое «слово» до запятой определяет общий ЛК. Пользователи с одинаковым первым словом → общий whitelist.
  • Что делать в коде: брать первый clientid до запятой как активную компанию. Остальные (если есть) — дополнительные компании пользователя для переключателя.
  • Статус: 🟡 уточнено, требует реализации в коде

1.3. Несколько компаний на пользователя — УТОЧНЕНО

  • ТЗ, п.3.1: «поддерживается сценарий, когда пользователь принадлежит нескольким компаниям»
  • Уточнение заказчика (01.06.2026): поле clientid в claims содержит список через запятую. Примеры: WZ11125, WZ03816, WZ52235, WZ62587, WZ02315.
  • Логика ЛК: первое значение до запятой — активная компания. Пользователи с одинаковым первым clientid видят общий whitelist. Переключатель между компаниями — все значения из списка.
  • Открытый вопрос: какое именно поле в Keycloak за это отвечает? Заказчик уточнит.
  • Статус: 🟡 уточнено, требует реализации в коде

1.4. Admin-роль в Keycloak

  • ТЗ: admin = ClientID = WZ01112 + отдельный чек-бокс
  • Вопрос: чек-бокс — это claim? Какой? is_admin, realm_access.roles, groups?
  • Статус: 🔴

1.5. JWKS URL

  • Вариант A: https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/certs
  • Вариант B: https://auth-api... (через API Gateway)
  • Статус: 🔴

1.6. Redirect URI

  • Предложение: https://<домен>/callback
  • Статус: 🔴 требует подтверждения DevOps

2. Инфраструктура и деплой

2.1. Платформа

  • Статус: 🔴 уточнить — Node.js на k8s? Какой кластер?

2.2. Деплой

  • Статус: 🔴 уточнить — CI/CD? Как поставлять jsonEnv?

2.3. Сетевое ограничение для /export

  • Вопрос: какие IP/подсети будут потребителями внешней выдачи?
  • Статус: 🔴

3. Функциональные уточнения

3.1. Мульти-компания в UI

  • ТЗ, п.3.1: «переключатель активной компании»
  • Вопрос: дизайн переключателя? Dropdown в шапке? Отдельная страница?
  • Статус: 🔴

3.2. Soft-delete и фильтр «показать удалённые»

  • ТЗ, п.4.1: «для администратора предусмотрен фильтр»
  • Код: includeDeleted всегда false
  • Статус: 🟡 не реализовано в коде

3.3. Индивидуальные лимиты компаний

  • ТЗ, п.4.5: админ может задать индивидуальный лимит
  • Код: ?
  • Статус: 🔴 проверить реализацию

3.4. Уведомление о нормализации

  • ТЗ, п.5: «пользователь должен быть уведомлен, что ввел адрес из хостовой части»
  • Статус: 🔴 проверить реализацию в UI

4. Тестовые данные

4.1. Тестовые пользователи

Email ClientID Компания Роль
client@example.com WZ01325 Тест Клиент
admin@nubes.ru WZ01112 Нубес Админ
tazetdinovn@gmail.com ? ? ? (из token.txt)

4.2. HAR-сессия

  • Файл: Files/nubes_login.har
  • Пользователь: tazet@narod.ru
  • Дата: 2026-05-30
  • Окружение: deck-test

6. Уточнения от заказчика (01.06.2026)

6.1. Формат clientid в токене

  • Поле: clientid в claims JWT
  • Формат: строка, значения через запятую если несколько
  • Примеры:
    • "WZ04228" — одна компания
    • "1700" — числовой ID
    • "asokolov-test" — текстовый ID
    • "WZ11125, WZ03816" — две компании
    • "WZ52235, WZ62587, WZ02315" — три компании
  • Правило: первое «слово» до запятой = активная компания (определяет ЛК)
  • Общий доступ: пользователи с одинаковым первым словом имеют общий whitelist

6.2. Экспорт — подтверждение формата

  • GET-endpoint отдаёт txt файл
  • Одна строка = один объект (адрес/подсеть)
  • Без разделителей, без заголовков

6.3. Текущее демо — одобрено

  • https://white.nodejsk8s.dev.nubes.ru/login — ✓
  • https://white.nodejsk8s.dev.nubes.ru/exp — ✓ (вывод без токена для тестирования)

6.4. Что ещё уточняется

  • Какое именно поле Keycloak маппится в clientid claim? (Заказчик уточнит)
  • Как определяется admin-роль? (отдельный чек-бокс в Keycloak?)
  • client_id и client_secret для регистрации приложения

6.5. Права внутри компании — уточнено (02.06.2026)

  • Вопрос: может ли любой юзер компании редактировать whitelist всей компании?
  • Ответ заказчика: «Да, любой юзер, который может войти может редактировать»
  • Вывод: внутри компании роли не разграничиваются. Любой сотрудник компании имеет полный доступ к whitelist своей компании (создание, редактирование, удаление). Аудит фиксирует кто именно сделал изменение.

5. Решения и договорённости

Сюда записывать принятые решения с датой и контекстом.

(пока пусто)


Легенда статусов

Статус Значение
🔴 Требует уточнения
🟡 Уточнено, не реализовано
🟢 Реализовано / подтверждено
Отменено / не актуально