// composables/useAdminAuth.ts // // Admin-Auth-Composable. // // Auth-Architektur: // 1. User loggt sich via Supabase (Email/Password) ein -- normaler Supabase-JWT. // 2. Nach Login: Backend-Aufruf gegen GET /api/admin/verify-admin (Phase 3). // Das Backend prueft ob die Supabase-User-ID in der admin_users-Tabelle steht. // Bei Fehlschlag: sofort ausloggen (kein einfacher User darf rein). // 3. Admin-Status wird in useSupabaseUser() gehalten -- kein extra State noetig. // // Phase 3 TODO: Backend muss /api/admin/verify-admin implementieren mit requireAdmin-Middleware. // // DSGVO-Note: Admin-Logins werden server-side in audit_log geloggt (Phase 4 -- hans-mueller). export function useAdminAuth() { const supabase = useSupabaseClient() const user = useSupabaseUser() const config = useRuntimeConfig() // Computed E-Mail fuer Topbar-Anzeige const adminEmail = computed(() => user.value?.email ?? "") // Login via Supabase Email/Password async function loginWithPassword(email: string, password: string) { const { error } = await supabase.auth.signInWithPassword({ email, password }) if (error) throw new Error(error.message) // Phase 3: Admin-Verifikation gegen Backend. // Aktuell nur Supabase-Login -- requireAdmin-Check kommt in Phase 3. // TODO: await verifyAdminRole() } // Logout -- Supabase-Session beenden, zurueck zu /login async function logout() { await supabase.auth.signOut() await navigateTo("/login") } // Phase 3: Backend-Check ob Supabase-User in admin_users-Tabelle steht. // Wirft Error wenn nicht -- Caller soll dann logout() aufrufen. async function verifyAdminRole() { const session = await supabase.auth.getSession() const token = session.data.session?.access_token if (!token) throw new Error("Keine aktive Session") const res = await $fetch(`${config.public.apiBase}/api/admin/verify-admin`, { method: "GET", headers: { Authorization: `Bearer ${token}` }, }) // Backend gibt { isAdmin: true } zurueck -- alles andere ist Zugriffsverweigerung. if (!(res as { isAdmin: boolean }).isAdmin) { await supabase.auth.signOut() throw new Error("Kein Admin-Zugriff") } } return { user, adminEmail, loginWithPassword, logout, verifyAdminRole, } }