ИСПРАВЛЕНИЕ - NODEDC LAUNCHER: завершать IdP logout без локальной сессии

This commit is contained in:
DCCONSTRUCTIONS 2026-05-05 09:20:50 +03:00
parent 6e8b05c679
commit 2e634c6c35
1 changed files with 15 additions and 13 deletions

View File

@ -199,19 +199,7 @@ app.get("/auth/logout", asyncRoute(async (req, res) => {
}
const discovery = await getOidcDiscovery();
const endSessionEndpoint = discovery.end_session_endpoint;
const loginRedirectUrl = buildLoginRedirectUrl(returnTo, { forceLogin: true });
if (!endSessionEndpoint || !session?.tokenSet.idToken) {
setNoStore(res);
res.type("html").send(renderGlobalLogoutPage(getFrontchannelLogoutUrls(), loginRedirectUrl));
return;
}
const logoutUrl = new URL(endSessionEndpoint);
logoutUrl.searchParams.set("client_id", config.clientId);
logoutUrl.searchParams.set("post_logout_redirect_uri", buildLoggedOutRedirectUrl(returnTo));
logoutUrl.searchParams.set("id_token_hint", session.tokenSet.idToken);
const logoutUrl = buildOidcLogoutUrl(discovery, returnTo, session?.tokenSet.idToken);
setNoStore(res);
res.type("html").send(renderGlobalLogoutPage(getFrontchannelLogoutUrls(), logoutUrl.toString()));
@ -1454,6 +1442,20 @@ function buildLoginRedirectUrl(returnTo, { forceLogin = false } = {}) {
return loginUrl.toString();
}
function buildOidcLogoutUrl(discovery, returnTo = "/", idToken = null) {
const endpoint = discovery.end_session_endpoint || new URL("/application/o/launcher/end-session/", config.issuer).toString();
const logoutUrl = new URL(endpoint);
logoutUrl.searchParams.set("client_id", config.clientId);
logoutUrl.searchParams.set("post_logout_redirect_uri", buildLoggedOutRedirectUrl(returnTo));
if (idToken) {
logoutUrl.searchParams.set("id_token_hint", idToken);
}
return logoutUrl;
}
function buildLoggedOutRedirectUrl(returnTo = "/") {
const loggedOutUrl = new URL("/auth/logged-out", config.appBaseUrl);
const cleanReturnTo = sanitizeReturnTo(returnTo);