Vier Anleitungen unter docs/betrieb/: Inbetriebnahme in der richtigen Reihenfolge, HTTPS mit nginx Proxy Manager sowie netbird als privates Netz, OIDC mit authentik samt Fehlerbildern, und Sicherung einschliesslich Zurueckspielen. Beim Aufschreiben zwei Fehler gefunden, die nur hinter einem Reverse Proxy auftreten: Die OIDC-Rueckkehradresse uebersah die im Dashboard eingetragene Adresse, und beim Einloesen des Codes wurde die interne Adresse verwendet - der Anbieter haette den Tausch abgelehnt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
55 lines
2.3 KiB
TypeScript
55 lines
2.3 KiB
TypeScript
import { cookies } from "next/headers";
|
||
import { eigeneAdresse } from "@/lib/adresse";
|
||
import { cookieOptionen, SITZUNGS_COOKIE, sitzungErzeugen } from "@/lib/sitzung";
|
||
import { mitOidcAnmelden } from "@/server/auth/benutzer";
|
||
import { anmeldungAbschliessen, oidcEinstellungen } from "@/server/auth/oidc";
|
||
import { einstellungen as systemEinstellungen } from "@/server/einstellungen";
|
||
|
||
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);
|
||
}
|
||
|
||
const { dashboardUrl } = await systemEinstellungen();
|
||
|
||
if (!einstellungen || !pruefwert || !zustand) {
|
||
return Response.redirect(eigeneAdresse(request, "/login?fehler=oidc", dashboardUrl), 302);
|
||
}
|
||
|
||
try {
|
||
// Hinter einem Reverse Proxy ist `request.url` die interne Adresse. Der Anbieter hat aber die
|
||
// öffentliche als Rückkehradresse hinterlegt – mit der internen scheitert der Tausch des Codes.
|
||
const angekommen = new URL(request.url);
|
||
const oeffentlich = eigeneAdresse(request, `${angekommen.pathname}${angekommen.search}`, dashboardUrl);
|
||
|
||
const angaben = await anmeldungAbschliessen(einstellungen, oeffentlich, pruefwert, zustand);
|
||
const benutzer = await mitOidcAnmelden(angaben.subject, angaben.email, angaben.name);
|
||
|
||
const { sitzungsdauerStunden } = await systemEinstellungen();
|
||
const token = await sitzungErzeugen(
|
||
{
|
||
benutzerId: benutzer.id,
|
||
email: benutzer.email,
|
||
name: benutzer.name,
|
||
herkunft: "oidc",
|
||
},
|
||
sitzungsdauerStunden,
|
||
);
|
||
speicher.set(SITZUNGS_COOKIE, token, cookieOptionen(sitzungsdauerStunden));
|
||
|
||
return Response.redirect(eigeneAdresse(request, ziel.startsWith("/") ? ziel : "/", dashboardUrl), 302);
|
||
} catch (fehler) {
|
||
console.error("OIDC-Rückkehr fehlgeschlagen:", fehler);
|
||
return Response.redirect(eigeneAdresse(request, "/login?fehler=oidc", dashboardUrl), 302);
|
||
}
|
||
}
|