Deprecated (описывали состояние до рефакторинга): [DEPRECATED]-plan.md [DEPRECATED]-analysis-2026-05-30.md [DEPRECATED]-auth-architecture.md Новые/обновлённые: architecture.md — текущее устройство: стек, модули, auth-схема, env, маршруты plan.md — только pending задачи (блокеры KK, деплой, Redis, пагинация) questions.md — закрытые вопросы отмечены, открытые: KK creds + admin claim + /export IP
4.1 KiB
IP WhiteList — План (pending задачи, 2026-05-30)
Ветка:
sonnet
Всё что было в старых планах — реализовано. Здесь только то, чего ещё нет.
Блокер 1 — Keycloak OIDC (нужны данные от DevOps)
Код OIDC Authorization Code Flow написан и готов (src/auth.js).
Не активируется пока не получены:
| Что нужно | Env-переменная | Статус |
|---|---|---|
| client_id в realm cloud | KC_CLIENT_ID |
❌ ждём DevOps |
| client_secret | KC_CLIENT_SECRET |
❌ ждём DevOps |
| redirect_uri зарегистрирован в KK | (в самом KK) | ❌ ждём DevOps |
| SESSION_SECRET для продакшена | SESSION_SECRET |
❌ нужно сгенерировать |
Без этого сервис работает в mock-режиме (/dev-login как тестовый backdoor).
Блокер 2 — Admin-роль из Keycloak
Сейчас admin = clientId === WZ01112.
Как реально приходит isAdmin из KK — не ясно (см. questions.md).
После получения ответа — 1–2 строки в userFromPayload() в src/auth.js.
Задача 1 — Деплой ветки sonnet
- Передеплоить на
white.nodejsk8s.dev.nubes.ru(сейчас там master) - Добавить env-секреты в k8s:
SESSION_SECRET,CSRF_SECRET - Проверить smoke-тест:
/healthz,/login,/export
Задача 2 — Сессии при multi-pod
Сейчас: MemoryStore (in-process, не масштабируется).
При нескольких репликах k8s сессии будут теряться.
npm install connect-redis ioredis- Подключить Redis в
server.js(3 строки конфига) - Добавить
REDIS_URLв env
Блокер: нужен Redis в k8s (или принять ограничение на 1 реплику пока).
Задача 3 — IP-ограничение /export
ТЗ: endpoint доступен без авторизации, ограничен по IP на старте.
Текущее решение: открытый endpoint с rate-limit (20 req/мин).
- Уточнить: ограничение в приложении или ingress? (см. questions.md)
- Если в приложении: whitelist IP через
EXPORT_ALLOWED_IPSenv var
Задача 4 — Пагинация
При custom_limit > 50 таблица станет неудобной.
Сейчас все записи выводятся без пагинации.
GET /?page=N+LIMIT/OFFSETвqueries.listEntries()- Кнопки Назад/Вперёд в
views/index.ejs
Низкий приоритет — текущий дефолтный лимит 15 записей на компанию.
Задача 5 — Auto-dismiss alert
Flash-алерты (ошибка/успех) сейчас исчезают только при перезагрузке.
- 10 строк JS в
views/index.ejs:setTimeout(() => alert.remove(), 5000)
Не делать (закрыто)
| Что | Почему |
|---|---|
| ✅ csrf-csrf (double-submit cookie) | |
| ✅ 131 строка, роутеры вынесены | |
✅ 50 unit-тестов (node tests/run-tests.js) |
|
✅ в src/validators.js |
|
✅ src/routes/admin.js, views/admin.ejs |
|
✅ POST /edit/:id |
|
✅ GET /audit |
|
✅ src/auth.js + src/routes/auth.js |
|
✅ express-session в server.js |
|
✅ /dev-login с пресетами + кастомные поля |