diff --git a/package.json b/package.json index 1e28012..6132c85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.74", + "version": "0.5.75", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/server.js b/v2/server.js index 2bce093..95883d1 100644 --- a/v2/server.js +++ b/v2/server.js @@ -6,6 +6,11 @@ // // ПОТОМ: будет свой /v2/login → /v2/callback через production KC. // Тогда заработает login() из src/auth/index.js. +// +// Модули: +// router/ — resolveContext: admin/user/impersonation → req.v2_* +// user/ — обычный CRUD (пустышка) +// admin/ — админка (пустышка) // ═══════════════════════════════════════════════════════════════════════════════ 'use strict'; @@ -13,13 +18,14 @@ const express = require('express'); const config = require('./src/config'); const auth = require('./src/auth'); +const { resolveContext } = require('./src/router'); +const { createUserRouter } = require('./src/user'); +const { createAdminRouter } = require('./src/admin'); function createV2Router() { const router = express.Router(); // ── GET /v2/login — редирект на основной вход ────────────────────────── - // ⚠️ ВРЕМЕННО: использует старый OIDC основного приложения. - // ПОТОМ: заменить на свой OIDC-поток через auth.buildAuthUrl(). router.get('/login', (req, res) => { res.redirect('/login?returnTo=' + encodeURIComponent('/v2/iam')); }); @@ -27,41 +33,35 @@ function createV2Router() { // ── GET /v2/iam — показать IAM-данные из сессии ──────────────────────── router.get('/iam', (req, res) => { const u = req.session && req.session.user; - if (!u) { - return res.send('

Нет данных

Сначала войдите.

'); - } + if (!u) return res.send('

Нет данных

Войти

'); res.send(` -V2 — IAM Response - -

✅ Данные IAM (v${config.version})

-

Email: ${u.email}

-

clientId: ${u.clientId} (W-номер)

-

Компания: ${u.companyName}

-

isAdmin: ${u.isAdmin}

-

ФИО: ${u.fio || '—'}

-

Компаний: ${u.allClientIds ? u.allClientIds.length : 0} — ${(u.allClientIds || []).join(', ')}

-${u.isImpersonated ? '

⚠️ Имперсонация: ' + u.originalUserEmail + ' → ' + u.email + '

' : ''} -
-

session.user (полный объект)

-
${JSON.stringify(u, null, 2)}
-

Выйти из V2 | Основное приложение

- - `); +V2 — IAM + +

IAM Response (v${config.version})

+

Email: ${u.email}

+

clientId: ${u.clientId}

+

Компания: ${u.companyName}

+

isAdmin: ${u.isAdmin}

+

ФИО: ${(u.fio && u.fio.fullName) || u.fio || '—'}

+

Компаний: ${u.allClientIds ? u.allClientIds.length : 0} — ${(u.allClientIds || []).join(', ')}

+
${JSON.stringify(u, null, 2)}
+

Выйти | CRUD | Админка

+`); }); - // ── GET /v2/ — алиас на /v2/iam ───────────────────────────────────────── + // ── /v2/app — обычный CRUD (только для авторизованных) ───────────────── + router.use('/app', resolveContext, createUserRouter()); + + // ── /v2/admin — админка (только для авторизованных) ──────────────────── + router.use('/admin', resolveContext, createAdminRouter()); + + // ── GET /v2/ ───────────────────────────────────────────────────────────── router.get('/', (req, res) => res.redirect('/v2/iam')); // ── GET /v2/logout ─────────────────────────────────────────────────────── - router.get('/logout', (req, res) => { - res.redirect('/logout'); - }); + router.get('/logout', (req, res) => res.redirect('/logout')); return router; } diff --git a/v2/src/admin/index.js b/v2/src/admin/index.js new file mode 100644 index 0000000..f940fce --- /dev/null +++ b/v2/src/admin/index.js @@ -0,0 +1,23 @@ +// ═══════════════════════════════════════════════════════════════════════════════ +// V2 — админка (пустышка) +// Будет: аудит, лимиты, список всех компаний, toggle «Администратор» +// ═══════════════════════════════════════════════════════════════════════════════ + +const express = require('express'); + +function createAdminRouter() { + const router = express.Router(); + + router.get('/', (req, res) => { + res.send(`

Admin panel

+

email: ${req.v2_email}

+

clientId: ${req.v2_clientId}

+

Все компании: ${(req.v2_allClientIds || []).join(', ') || '—'}

+

Пользовательский CRUD | Выйти

+ `); + }); + + return router; +} + +module.exports = { createAdminRouter }; diff --git a/v2/src/config/index.js b/v2/src/config/index.js index 30d90ab..855300b 100644 --- a/v2/src/config/index.js +++ b/v2/src/config/index.js @@ -6,7 +6,7 @@ // ═══════════════════════════════════════════════════════════════════════════════ module.exports = { - version: '0.5.74', + version: '0.5.75', iamUrl: process.env.V2_IAM_API_URL || 'https://auth-api.ngcloud.ru', appUrl: process.env.V2_APP_URL || 'https://whitelist.nodejsk8s.services.ngcloud.ru', }; diff --git a/v2/src/router/index.js b/v2/src/router/index.js new file mode 100644 index 0000000..6730722 --- /dev/null +++ b/v2/src/router/index.js @@ -0,0 +1,31 @@ +// ═══════════════════════════════════════════════════════════════════════════════ +// V2 — роутер по роли +// Определяет контекст (admin/user/impersonation) и направляет куда нужно. +// ═══════════════════════════════════════════════════════════════════════════════ + +/** + * middleware — извлекает контекст из сессии и кладёт в req.v2_* + * Вызывается перед всеми маршрутами v2. + */ +function resolveContext(req, res, next) { + const u = req.session && req.session.v2_user; + if (!u) return res.redirect('/v2/login'); + + const isAdmin = !!(u.isAdmin && req.session.v2_adminMode); + const isImpersonated = !!u.isImpersonated; + + // Контекст для CRUD + req.v2_email = isImpersonated ? (u.originalUserEmail || u.email) : u.email; + req.v2_clientId = isImpersonated ? (u.impersonatedCompanyId || u.activeClientId || u.clientId) : (u.activeClientId || u.clientId); + req.v2_isAdmin = isAdmin; + req.v2_isImpersonated = isImpersonated; + req.v2_impersonatedBy = isImpersonated ? u.email : null; // кто реально (для аудита) + req.v2_user = u; + req.v2_allClientIds = u.allClientIds || []; + req.v2_profiles = u.profiles || []; + req.v2_companyName = u.companyName || u.clientId; + + next(); +} + +module.exports = { resolveContext }; diff --git a/v2/src/user/index.js b/v2/src/user/index.js new file mode 100644 index 0000000..4661c92 --- /dev/null +++ b/v2/src/user/index.js @@ -0,0 +1,24 @@ +// ═══════════════════════════════════════════════════════════════════════════════ +// V2 — пользовательский CRUD (пустышка) +// Будет: таблица записей, форма добавления, выбор компании из дропдауна +// ═══════════════════════════════════════════════════════════════════════════════ + +const express = require('express'); + +function createUserRouter() { + const router = express.Router(); + + router.get('/', (req, res) => { + res.send(`

User CRUD

+

email: ${req.v2_email}

+

clientId: ${req.v2_clientId}

+

isAdmin: ${req.v2_isAdmin}

+

isImpersonated: ${req.v2_isImpersonated}

+

Админка | Выйти

+ `); + }); + + return router; +} + +module.exports = { createUserRouter };