Viele Aktionen gaben keine Rueckmeldung (Retoure annehmen, Archiv, Bewertungen, Adressen, Newsletter, Kundensperre ...) oder meldeten Erfolg, obwohl die zugehoerige E-Mail nie rausging. - lib/flash: Meldung als kurzlebiges Cookie; Toast im Root-Layout (FlashToast). Ersetzt ?message=/?error= in der URL — darueber liess sich bisher beliebiger Text als Systemmeldung im Wabenhain-Layout anzeigen (Phishing-Hebel). Server Components leiten ueber /api/hinweis mit festen Codes und festen Zielen weiter. - fail()/succeed() zentral und asynchron; ein Quelltext-Test stellt sicher, dass jeder Aufruf mit await/return erfolgt (sonst liefe eine Action nach einem Fehler weiter). - sendMail meldet, ob die Mail angenommen wurde; Aktionen mit Mail zeigen ehrlich an, wenn der Versand scheitert (z.B. "Link erneut senden"). - Jede Server Action meldet jetzt Erfolg oder den Grund des Abbruchs. - SubmitFeedback: geklickter Knopf zeigt sofort einen Ladezustand und ist bis zur Antwort gegen Doppelklick gesperrt. - 2FA: nach dem Einrichten zurueck ins Profil statt auf die Seite mit "Deaktivieren". Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
30 lines
1.1 KiB
TypeScript
30 lines
1.1 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { withFlash } from "@/lib/flash";
|
|
import { getBaseUrl } from "@/lib/url";
|
|
import { setEntraOAuthCookie } from "@/lib/auth";
|
|
import { signEntraOAuthState } from "@/lib/session";
|
|
import { isEntraConfigured, buildEntraAuthorizeUrl, generatePkcePair, generateOAuthState } from "@/lib/entra";
|
|
|
|
/**
|
|
* Startet die Microsoft-Anmeldung ("Mit Microsoft anmelden" auf /konto):
|
|
* erzeugt PKCE-Paar + CSRF-state, hinterlegt beides in einem kurzlebigen,
|
|
* signierten Cookie (siehe lib/session.ts ENTRA_OAUTH_COOKIE) und leitet zu
|
|
* Microsofts /authorize-Endpunkt weiter.
|
|
*/
|
|
export async function GET() {
|
|
if (!isEntraConfigured()) {
|
|
return withFlash(
|
|
NextResponse.redirect(new URL("/konto", getBaseUrl())),
|
|
"error",
|
|
"SSO ist noch nicht konfiguriert. Bitte melde dich mit E-Mail und Passwort an."
|
|
);
|
|
}
|
|
|
|
const { codeVerifier, codeChallenge } = generatePkcePair();
|
|
const state = generateOAuthState();
|
|
const cookieToken = await signEntraOAuthState(state, codeVerifier);
|
|
await setEntraOAuthCookie(cookieToken);
|
|
|
|
return NextResponse.redirect(buildEntraAuthorizeUrl({ state, codeChallenge }));
|
|
}
|