scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
66 lines (48 loc) • 1.61 kB
text/typescript
import { clientConfig } from 'scrivito_sdk/client';
import {
InternalError,
assignLocation,
currentHref,
never,
onReset,
} from 'scrivito_sdk/common';
/** a LoginHander which redirects the browser to the login url */
export async function loginRedirectHandler(
visit: string,
idp?: string
): Promise<void> {
assignLocation(await authenticationUrl(visit, idp));
return never();
}
let globalIdp: string | undefined;
export function setIdentityProvider(idp?: string): void {
globalIdp = idp;
}
// for testing purposes only
export function getIdentityProvider(): string | undefined {
return globalIdp;
}
let loggedInParamName: string | undefined;
export function setLoggedInIndicatorParam(paramName: string): void {
loggedInParamName = paramName;
}
async function authenticationUrl(visit: string, idp?: string): Promise<string> {
let authUrl = visit.replace('$RETURN_TO', encodeURIComponent(returnToUrl()));
const iamAuthLocation = (await clientConfig.fetch()).iamAuthLocation;
if (!iamAuthLocation) throw new InternalError();
authUrl = authUrl.replace('$JR_API_LOCATION/iam/auth', iamAuthLocation);
const identityProvider = globalIdp || idp;
if (!identityProvider) return authUrl;
const authUrlWithIdp = new URL(authUrl);
authUrlWithIdp.searchParams.set('idp', identityProvider);
return authUrlWithIdp.toString();
}
function returnToUrl() {
const url = new URL(currentHref());
if (loggedInParamName) url.searchParams.set(loggedInParamName, '');
return url.toString();
}
onReset(() => {
globalIdp = undefined;
loggedInParamName = undefined;
});