in server/middleware/identityMiddleware.ts [214:302]
await revokeAccessToken(
req.signedCookies[OAuthAccessTokenCookieName],
);
}
clearOAuthCookies(res);
}
}
// Set as much as possible of the local state from the available combination of
// GU_U and the ID token.
setLocalStateFromIdTokenOrUserCookie(
req,
res,
verifiedTokens?.idToken,
oktaConfig.maxAge,
);
return next();
}
} catch (err) {
return handleIdentityMiddlewareError(err, res);
}
};
const authenticateWithIdapi: (statusCodeOverride?: number) => RequestHandler =
(statusCodeOverride?: number) =>
(req: Request, res: Response, next: NextFunction) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- assume we don't know the range of possible types for the detail argument?
const errorHandler = (message: string, detail?: any) => {
handleAwsRelatedError(message, detail);
res.redirect('/sign-in-error');
};
const useRefererHeaderForManageUrl = !!statusCodeOverride;
idapiConfigPromise
.then((idapiConfig) => {
if (idapiConfig) {
fetch(
url.format({
protocol: 'https',
host: idapiConfig.host,
pathname: 'auth/redirect',
}),
{
headers: {
'X-GU-ID-Client-Access-Token':
'Bearer ' + idapiConfig.accessToken,
[X_GU_ID_FORWARDED_SCOPE]:
req.header(X_GU_ID_FORWARDED_SCOPE) ||
getScopeFromRequestPathOrEmptyString(
req.path,
),
Cookie: getCookiesOrEmptyString(req),
},
},
)
.then(
(redirectResponse) =>
redirectResponse.json() as Promise<RedirectResponseBody>,
)
.then((redirectResponseBody) => {
// tslint:disable-next-line:no-object-mutation
Object.assign(res.locals, {
identity: redirectResponseBody,
});
if (!requiresSignin(req.originalUrl)) {
next();
} else if (redirectResponseBody.redirect) {
redirectOrCustomStatusCode(
res,
augmentRedirectURL(
req,
redirectResponseBody.redirect.url,
conf.DOMAIN,
useRefererHeaderForManageUrl,
),
statusCodeOverride,
);
} else if (
redirectResponseBody.signInStatus ===
'signedInRecently'
) {
// If the request to manage contains sign-in token query parameters,
// but they are not needed because the user is already signed in,
// redirect them to the same url, but with the sign-in token query parameters removed.
// This ensures the sensitive query parameters will not be recorded by Ophan,
// in addition to the url the user sees in the browser being simpler.
if (containsSignInTokenQueryParameters(req)) {