mirror of
https://github.com/tale/headplane.git
synced 2026-08-12 22:56:53 +00:00
d4eee702e9
Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-019e5550-4435-7118-8393-cdcc97042178
38 lines
986 B
TypeScript
38 lines
986 B
TypeScript
import { data, redirect } from "react-router";
|
|
|
|
import { createOidcStateCookie } from "~/utils/oidc-state";
|
|
|
|
import type { Route } from "./+types/oidc-start";
|
|
|
|
export async function loader({ request, context }: Route.LoaderArgs) {
|
|
try {
|
|
await context.auth.require(request);
|
|
return redirect("/");
|
|
} catch {}
|
|
|
|
if (context.oidc.state !== "enabled") {
|
|
throw data(`OIDC is unavailable: ${context.oidc.reason}`, { status: 501 });
|
|
}
|
|
const service = context.oidc.value;
|
|
|
|
const result = await service.startFlow();
|
|
if (!result.ok) {
|
|
return redirect(`/login?s=${result.error.code}`);
|
|
}
|
|
|
|
const { url, flowState } = result.value;
|
|
const cookie = createOidcStateCookie(context.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,
|
|
}),
|
|
},
|
|
});
|
|
}
|