@redocly/portal-plugin-gravitee-sso
Version:
Gravitee SSO plugin for @redocly/portal
44 lines (31 loc) • 1.39 kB
text/typescript
import type { Store } from '@redocly/realm/dist/server/store.js';
import type { Logger } from '@redocly/realm/dist/server/utils/reporter/logger.js';
import type { Context } from 'hono';
import type { GraviteeSsoConfig } from './config.js';
import { LOGIN_PAGE_SLUG } from './constants.js';
import { isGraviteeSsoConfig } from './is-gravitee-sso-config.js';
export default async function (ctx: Context, store: Store): Promise<Response> {
const logger = ctx.get('logger') as Logger;
const parsedUrl = new URL(ctx.req.url);
const idpId = parsedUrl.searchParams.get('idpId');
if (!idpId) {
logger.error('Gravitee SSO: idpId query parameter not found');
return ctx.text('Forbidden', 403);
}
const idpConfig = store.ssoDirect?.[idpId] as GraviteeSsoConfig | unknown;
if (!isGraviteeSsoConfig(idpConfig)) {
logger.error(`Gravitee SSO: invalid idpId in query params: ${idpId}`);
return ctx.text('Forbidden', 403);
}
logger.info('Gravitee login initiated');
const redirectTo = parsedUrl.searchParams.get('redirectTo') || '/';
const localePrefix = parsedUrl.searchParams.get('localePrefix') || '';
const loginQueryParams = new URLSearchParams({
redirectTo,
idpId,
});
const loginPageUrl = `${localePrefix}${LOGIN_PAGE_SLUG}?${loginQueryParams.toString()}`;
return ctx.newResponse(null, 302, {
Location: loginPageUrl,
});
}