import { createHash, randomBytes } from "node:crypto"; import { NextResponse } from "next/server"; import { isConfigured } from "@/lib/auth/oidc-config"; import { storeState } from "@/lib/auth/oidc-state"; import { buildAuthorizeUrl, discover } from "@/lib/auth/oidc-client"; // Bewusst ein einfacher GET-Link statt eines CSRF-gesicherten POSTs: // der Browser muss hier auf die fremde Login-Seite des Identity // Providers navigieren (funktioniert nicht per fetch/XHR) – identisch // zum Muster jeder "Login mit X"-Schaltfläche. Die Absicherung gegen // Cross-Site-Missbrauch übernimmt der state-Parameter im Callback. export async function GET(request: Request) { if (!isConfigured()) { return NextResponse.json({ error: "oidc_not_configured" }, { status: 404 }); } const state = randomBytes(32).toString("base64url"); const nonce = randomBytes(32).toString("base64url"); const codeVerifier = randomBytes(32).toString("base64url"); const codeChallenge = createHash("sha256").update(codeVerifier).digest("base64url"); try { const discovery = await discover(); await storeState(state, nonce, codeVerifier); return NextResponse.redirect( buildAuthorizeUrl(discovery, { state, nonce, codeChallenge }) ); } catch { return NextResponse.redirect(new URL("/login?error=oidc_failed", request.url)); } }