Signierte Sitzungs-Cookies mit jose, OIDC ueber openid-client (authentik), Schutz in proxy.ts, Anmeldeseite, Audit-Log-Ansicht, Sicherheits-Kopfzeilen und Rate-Limit. Kein Auth.js, weil Version 5 Beta ist. 147 Tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
import { cookies } from "next/headers";
|
|
import { cookieOptionen, SITZUNGS_COOKIE, sitzungErzeugen } from "@/lib/sitzung";
|
|
import { mitOidcAnmelden } from "@/server/auth/benutzer";
|
|
import { anmeldungAbschliessen, oidcEinstellungen } from "@/server/auth/oidc";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
/** Nimmt die Rückkehr vom Anmeldedienst entgegen und legt die Sitzung an. */
|
|
export async function GET(request: Request) {
|
|
const einstellungen = oidcEinstellungen();
|
|
const speicher = await cookies();
|
|
const pruefwert = speicher.get("pl_oidc_pruefwert")?.value;
|
|
const zustand = speicher.get("pl_oidc_zustand")?.value;
|
|
const ziel = speicher.get("pl_oidc_ziel")?.value ?? "/";
|
|
|
|
for (const name of ["pl_oidc_pruefwert", "pl_oidc_zustand", "pl_oidc_ziel"]) {
|
|
speicher.delete(name);
|
|
}
|
|
|
|
if (!einstellungen || !pruefwert || !zustand) {
|
|
return Response.redirect(new URL("/login?fehler=oidc", request.url), 302);
|
|
}
|
|
|
|
try {
|
|
const angaben = await anmeldungAbschliessen(einstellungen, new URL(request.url), pruefwert, zustand);
|
|
const benutzer = await mitOidcAnmelden(angaben.subject, angaben.email, angaben.name);
|
|
|
|
const token = await sitzungErzeugen({
|
|
benutzerId: benutzer.id,
|
|
email: benutzer.email,
|
|
name: benutzer.name,
|
|
herkunft: "oidc",
|
|
});
|
|
speicher.set(SITZUNGS_COOKIE, token, cookieOptionen());
|
|
|
|
return Response.redirect(new URL(ziel.startsWith("/") ? ziel : "/", request.url), 302);
|
|
} catch (fehler) {
|
|
console.error("OIDC-Rückkehr fehlgeschlagen:", fehler);
|
|
return Response.redirect(new URL("/login?fehler=oidc", request.url), 302);
|
|
}
|
|
}
|