v0.5.158: logout без KC, 401=destroy+redirect SSO

This commit is contained in:
2026-06-17 20:51:12 +04:00
parent c823ae8128
commit 2d164fb9ee
3 changed files with 50 additions and 23 deletions
+17 -7
View File
@@ -1,18 +1,27 @@
const https = require('https');
const config = require('../config');
function resolveContext(req, res, next) {
/**
* Express middleware — извлекает контекст из сессии.
* При 401 от IAM — чистит сессию и редиректит на логин (SSO).
*/
async function resolveContext(req, res, next) {
const u = req.session && req.session.user;
// Нет сессии — нет доступа
if (!u) return res.redirect('/v2/login');
// ── Проверка имперсонации через IAM ──────────────────────────────
// Если есть токен — запрашиваем свежие данные, чтобы обнаружить имперсонацию
// которая могла начаться после логина (ЛК сессия отдельно от whitelist).
const token = req.session && req.session.token;
if (token) {
checkImpersonation(token, req, u).catch(() => { /* fallback — тихо */ });
try {
await checkImpersonation(token, req, u);
} catch (e) {
const msg = (e.message || '');
// 401 — токен протух, чистим сессию → SSO даст свежий
if (msg.startsWith('401')) {
req.session.destroy(() => res.redirect('/v2/login'));
return;
}
// Другие ошибки IAM — игнорируем, используем старые данные
}
}
applyContext(req, u);
@@ -21,6 +30,7 @@ function resolveContext(req, res, next) {
/**
* Запрашивает IAM и обновляет сессию если имперсонация изменилась.
* Бросает ошибку при 401 — вызывающий обработает.
*/
async function checkImpersonation(token, req, u) {
const url = config.iamApiBase + '/auth/user';