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('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 + '
' : ''} -${JSON.stringify(u, null, 2)}
-Выйти из V2 | Основное приложение
- - `); +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)}
+
+`);
});
- // ── 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(`email: ${req.v2_email}
+clientId: ${req.v2_clientId}
+Все компании: ${(req.v2_allClientIds || []).join(', ') || '—'}
+ + `); + }); + + 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(`email: ${req.v2_email}
+clientId: ${req.v2_clientId}
+isAdmin: ${req.v2_isAdmin}
+isImpersonated: ${req.v2_isImpersonated}
+ + `); + }); + + return router; +} + +module.exports = { createUserRouter };