headplane/app/routes/auth/oidc-start.ts

44 lines
1,018 B
TypeScript
Raw Normal View History

import { createCookie, type LoaderFunctionArgs, redirect } from 'react-router';
2025-03-22 01:36:27 -04:00
import type { LoadContext } from '~/server';
import { beginAuthFlow, getRedirectUri } from '~/utils/oidc';
2025-03-22 01:36:27 -04:00
export async function loader({
request,
context,
}: LoaderFunctionArgs<LoadContext>) {
try {
await context.sessions.auth(request);
2025-02-13 12:35:12 -05:00
return redirect('/machines');
} catch {}
if (!context.oidc || !context.config.oidc) {
2025-03-22 01:36:27 -04:00
throw new Error('OIDC is not enabled');
}
const cookie = createCookie('__oidc_auth_flow', {
httpOnly: true,
maxAge: 300, // 5 minutes
});
2025-03-22 01:36:27 -04:00
const redirectUri =
context.config.oidc?.redirect_uri ?? getRedirectUri(request);
const data = await beginAuthFlow(
context.oidc,
redirectUri,
2025-08-28 22:49:55 -04:00
context.config.oidc.scope,
context.config.oidc.extra_params,
2025-03-22 01:36:27 -04:00
);
return redirect(data.url, {
status: 302,
headers: {
'Set-Cookie': await cookie.serialize({
state: data.state,
nonce: data.nonce,
code_verifier: data.codeVerifier,
redirect_uri: redirectUri,
}),
},
});
}