v0.5.158: logout без KC, 401=destroy+redirect SSO
This commit is contained in:
+17
-7
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user