"use server"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; import { createClient } from "@/lib/supabase/server"; // Anmeldung ausschliesslich über Entra ID (in Supabase heisst der Anbieter // „Azure"). Es gibt bewusst keinen Passwort-Pfad mehr: ein zweiter Anmeldeweg // neben dem Firmenkonto hebelt jede Vorgabe des Mandanten aus — Mehrfaktor, // bedingten Zugriff, Sperrung beim Austritt. // // Für die Datenbank ändert sich dadurch nichts. auth.uid() liefert weiterhin // eine UUID, profiles.id trägt weiterhin role und is_active, und damit bleiben // is_hr_user() und alle darauf gebauten RLS-Policies unverändert gültig. export async function signInWithEntra() { const supabase = await createClient(); // Die Herkunft kommt aus dem Request statt aus einer Umgebungsvariablen, // damit lokal, Vorschau und Produktion denselben Code benutzen. Supabase // nimmt das Ziel nur an, wenn es in der Redirect-Allowlist des Projekts // steht — ein untergeschobener Host läuft also ins Leere. const origin = (await headers()).get("origin") ?? "http://localhost:3000"; const { data, error } = await supabase.auth.signInWithOAuth({ provider: "azure", options: { // openid/profile/email sind das Minimum für Anmeldung und Anzeigename. // Weitere Berechtigungen holt sich die Anwendung bewusst nicht. scopes: "openid profile email", redirectTo: `${origin}/auth/callback`, }, }); if (error || !data.url) redirect("/login?error=sso_failed"); redirect(data.url); } export async function logout() { const supabase = await createClient(); await supabase.auth.signOut(); redirect("/login"); }