mirror of
https://github.com/tale/headplane.git
synced 2026-07-26 07:48:14 +00:00
45 lines
1.2 KiB
TypeScript
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,
|
|
}),
|
|
},
|
|
});
|
|
}
|