Files
headplane/app/routes/auth/oidc-start.ts
T
2026-06-22 16:40:29 -04:00

45 lines
1.2 KiB
TypeScript

import { data, redirect } from "react-router";
import { appConfigContext, authContext, oidcContext } from "~/server/context";
import { logOidcError } from "~/server/oidc/provider";
import { createOidcStateCookie } from "~/utils/oidc-state";
import type { Route } from "./+types/oidc-start";
export async function loader({ request, context }: Route.LoaderArgs) {
const auth = context.get(authContext);
const config = context.get(appConfigContext);
const oidc = context.get(oidcContext);
try {
await auth.require(request);
return redirect("/");
} catch {}
if (oidc.state !== "enabled") {
throw data(`OIDC is unavailable: ${oidc.reason}`, { status: 501 });
}
const service = oidc.value;
const result = await service.startFlow();
if (!result.ok) {
logOidcError("OIDC start failed", result.error);
return redirect(`/login?s=${result.error.code}`);
}
const { url, flowState } = result.value;
const cookie = createOidcStateCookie(config);
return redirect(url, {
status: 302,
headers: {
"Set-Cookie": await cookie.serialize({
state: flowState.state,
nonce: flowState.nonce,
verifier: flowState.codeVerifier,
redirect_uri: flowState.redirectUri,
}),
},
});
}