UNPKG

@redocly/portal-plugin-gravitee-sso

Version:

Gravitee SSO plugin for @redocly/portal

44 lines (31 loc) 1.4 kB
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.getConfig().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, }); }