Files
ipwhitelist-app/docs/ТЗ-плюс.md
T

7.8 KiB

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

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


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

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

  • Дата: 2026-06-02
  • Источник: HAR Files/nubes_login.har
  • Факт: client_id = deck-test.ngcloud.ru (в URL auth-запроса)
  • Статус: 🔴 требует подтверждения — этот ли client_id для ipwhitelist, или будет отдельный?

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

  • ТЗ: claim ClientID — идентификатор компании
  • Факт (HAR): ClientID: "WZ01325", нет массива
  • Факт (token.txt): ClientID отсутствует, вместо него claims[] с названиями namespace'ов
  • Уточнение заказчика (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://white.nodejsk8s.dev.nubes.ru/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 Компания Роль
tazet@narod.ru 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 для регистрации приложения

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

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

(пока пусто)


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

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