mirror of
https://github.com/umami-software/umami.git
synced 2026-02-06 05:37:20 +01:00
40 lines
1 KiB
TypeScript
40 lines
1 KiB
TypeScript
import { NextRequest } from 'next/server';
|
|
import {
|
|
getEffectiveOIDCConfig,
|
|
generateState,
|
|
generateCodeVerifier,
|
|
generateCodeChallenge,
|
|
getAuthorizationUrl,
|
|
} from '@/lib/oidc';
|
|
import { json, badRequest } from '@/lib/response';
|
|
|
|
export const runtime = 'nodejs';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const cfg = await getEffectiveOIDCConfig();
|
|
|
|
if (!cfg.enabled) {
|
|
return badRequest('OIDC is not enabled');
|
|
}
|
|
|
|
const url = new URL(request.url);
|
|
const returnUrl = url.searchParams.get('returnUrl') || '/dashboard';
|
|
|
|
const state = await generateState();
|
|
const codeVerifier = await generateCodeVerifier();
|
|
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
|
|
const authUrl = await getAuthorizationUrl(cfg, state, codeChallenge);
|
|
|
|
const stateData = Buffer.from(
|
|
JSON.stringify({
|
|
state,
|
|
codeVerifier,
|
|
returnUrl,
|
|
}),
|
|
).toString('base64url');
|
|
|
|
const finalAuthUrl = authUrl.replace(`state=${state}`, `state=${stateData}`);
|
|
|
|
return json({ url: finalAuthUrl });
|
|
}
|