diff --git a/package.json b/package.json index 4822188..73f86eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.72", + "version": "0.5.73", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/server.js b/v2/server.js index 1dc0495..2bce093 100644 --- a/v2/server.js +++ b/v2/server.js @@ -1,6 +1,11 @@ // ═══════════════════════════════════════════════════════════════════════════════ -// V2 — тестовый роутер (монтируется в server.js как /v2) -// Только: вход через Keycloak → вывод ответа IAM на экран +// V2 — роутер (монтируется в server.js как /v2) +// +// СЕЙЧАС: показывает IAM-данные из сессии основного приложения. +// Вход — через основной /login (production KC). +// +// ПОТОМ: будет свой /v2/login → /v2/callback через production KC. +// Тогда заработает login() из src/auth/index.js. // ═══════════════════════════════════════════════════════════════════════════════ 'use strict'; @@ -9,105 +14,53 @@ const express = require('express'); const config = require('./src/config'); const auth = require('./src/auth'); -const oidcConfig = { - baseUrl: config.kcBaseUrl, - clientId: config.kcClientId, - clientSecret: config.kcClientSecret, - redirectUri: config.appUrl.replace(/\/$/, '') + '/v2/callback', -}; - -/** - * createV2Router — создаёт роутер для монтирования в основной server.js. - * Сессия используется общая, но ключи — с префиксом v2_ чтобы не пересекаться. - */ function createV2Router() { const router = express.Router(); - // ── GET /v2/ — главная (вывод IAM-данных) ─────────────────────────────── - router.get('/', (req, res) => { - if (!req.session.v2_user) { - return res.redirect('/v2/login'); + // ── GET /v2/login — редирект на основной вход ────────────────────────── + // ⚠️ ВРЕМЕННО: использует старый OIDC основного приложения. + // ПОТОМ: заменить на свой OIDC-поток через auth.buildAuthUrl(). + router.get('/login', (req, res) => { + res.redirect('/login?returnTo=' + encodeURIComponent('/v2/iam')); + }); + + // ── GET /v2/iam — показать IAM-данные из сессии ──────────────────────── + router.get('/iam', (req, res) => { + const u = req.session && req.session.user; + if (!u) { + return res.send('
Сначала войдите.
'); } - const u = req.session.v2_user; res.send(`Email: ${u.email}
-clientId: ${u.clientId} (активная компания)
+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}
` : ''} +${u.isImpersonated ? '⚠️ Имперсонация: ' + u.originalUserEmail + ' → ' + u.email + '
' : ''}${JSON.stringify(u, null, 2)}
-
+Выйти из V2 | Основное приложение
`); }); - // ── GET /v2/login — редирект на Keycloak ──────────────────────────────── - router.get('/login', (req, res) => { - if (req.session.v2_user) return res.redirect('/v2/'); - - const state = auth.generateState(); - req.session.v2_oidcState = state; - - const url = auth.buildAuthUrl({ ...oidcConfig, state }); - console.log('[v2] → Keycloak'); - res.redirect(url); - }); - - // ── GET /v2/callback — Keycloak возвращает пользователя ────────────────── - router.get('/callback', async (req, res) => { - const { code, state } = req.query; - - if (!state || state !== req.session.v2_oidcState) { - return res.status(403).send('Invalid state — possible CSRF attack'); - } - delete req.session.v2_oidcState; - - if (!code) { - return res.status(400).send('Missing authorization code'); - } - - try { - console.log('[v2] Exchanging code...'); - const result = await auth.login(code, oidcConfig, config.iamUrl); - - req.session.v2_user = result.sessionUser; - req.session.v2_token = result.token; - req.session.v2_idToken = result.idToken; - - console.log('[v2] ✅ Login OK:', result.sessionUser.email, result.sessionUser.clientId); - - res.redirect('/v2/'); - } catch (err) { - console.error('[v2] ❌ Login failed:', err.message); - res.status(500).send(` -${err.message}\n\n${err.stack || ''}
-
- `);
- }
- });
+ // ── GET /v2/ — алиас на /v2/iam ─────────────────────────────────────────
+ router.get('/', (req, res) => res.redirect('/v2/iam'));
// ── GET /v2/logout ───────────────────────────────────────────────────────
router.get('/logout', (req, res) => {
- delete req.session.v2_user;
- delete req.session.v2_token;
- delete req.session.v2_idToken;
- res.redirect('/v2/');
+ res.redirect('/logout');
});
return router;
diff --git a/v2/src/config/index.js b/v2/src/config/index.js
index 4167f90..be5f108 100644
--- a/v2/src/config/index.js
+++ b/v2/src/config/index.js
@@ -1,35 +1,12 @@
// ═══════════════════════════════════════════════════════════════════════════════
// Конфигурация V2
//
-// Приоритет: V2_* → основные → умолчания (локальный KC на ВМ)
+// СЕЙЧАС: IAM URL для fetchIamUser() + версия.
+// ПОТОМ: добавить KC_BASE_URL, KC_CLIENT_ID, KC_CLIENT_SECRET для своего OIDC.
// ═══════════════════════════════════════════════════════════════════════════════
-require('dotenv').config({ path: require('path').join(__dirname, '..', '..', '..', '.env') });
-
module.exports = {
- // Keycloak OIDC
- kcBaseUrl: process.env.V2_KC_BASE_URL
- || process.env.KC_BASE_URL
- || 'https://italo.kube5s.ru/realms/ipwhitelist',
-
- kcClientId: process.env.V2_KC_CLIENT_ID
- || process.env.KC_CLIENT_ID
- || 'ipwhitelist',
-
- kcClientSecret: process.env.V2_KC_CLIENT_SECRET
- || process.env.KC_CLIENT_SECRET
- || '',
-
- // IAM API
- iamUrl: process.env.V2_IAM_API_URL
- || process.env.IAM_API_URL
- || 'https://auth-api-dev.ngcloud.ru',
-
- // Наше приложение (НЕ Keycloak!)
- appUrl: process.env.V2_APP_URL
- || process.env.APP_URL
- || 'https://italo.kube5s.ru',
-
- // Админ
- adminClientId: process.env.ADMIN_CLIENT_ID || 'WZ01112',
+ version: '0.5.73',
+ iamUrl: process.env.V2_IAM_API_URL || 'https://auth-api.ngcloud.ru',
+ appUrl: process.env.V2_APP_URL || 'https://whitelist.nodejsk8s.services.ngcloud.ru',
};