server/okta.ts (47 lines of code) (raw):
import { joinUrl } from '@guardian/libs';
import { log } from './log';
import type { OktaValidationResponse } from './middleware/oktaServerSideAuthMiddleware';
import { IdTokenClaims } from './oauthConfig';
import type { OktaConfig } from './oktaConfig';
export const validateWithOkta = async ({
oktaConfig,
accessToken,
}: {
oktaConfig: OktaConfig;
accessToken: string;
}): Promise<OktaValidationResponse> => {
const issuerUrl = joinUrl(
oktaConfig.orgUrl,
'/oauth2/',
oktaConfig.authServerId,
);
try {
const oktaResponse = await fetch(`${issuerUrl}/v1/userinfo/`, {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
});
if (oktaResponse.status === 200) {
// Valid token
const oktaUserInfo = IdTokenClaims.parse(await oktaResponse.json());
return {
ok: true,
valid: true,
userId: oktaUserInfo.legacy_identity_id,
displayName: oktaUserInfo.name,
email: oktaUserInfo.email,
};
} else if ([401, 403].includes(oktaResponse.status)) {
log.error(`OAuth / Validate with Okta / Error: invalid token.`);
return { ok: true, valid: false };
} else {
log.error(
`OAuth / Validate with Okta / Error: unexpected status code from Okta: ${oktaResponse.status}`,
);
return { ok: false, valid: false };
}
} catch (error) {
log.error(`OAuth / Validate with Okta / Error: ${error.message}`);
return { ok: false, valid: false };
}
};