import { NextResponse } from 'next/server' import { z } from 'zod' import type { RegistrationResponseJSON } from '@simplewebauthn/server' import { auditSchreiben } from '@/server/audit' import { registrierungPruefen, registrierungsOptionen } from '@/server/auth/passkey' import { verlangeAnmeldungFuerApi } from '@/server/berechtigung' export const dynamic = 'force-dynamic' const abschluss = z.object({ bezeichnung: z.string().trim().min(1).max(60), antwort: z.looseObject({ id: z.string().min(1) }), }) /** Schritt 1: Optionen fuer einen neuen Passkey des angemeldeten Benutzers. */ export async function GET() { const benutzer = await verlangeAnmeldungFuerApi() if (!benutzer) { return NextResponse.json({ fehler: 'Nicht angemeldet.' }, { status: 401 }) } const optionen = await registrierungsOptionen(benutzer.id) return NextResponse.json(optionen, { headers: { 'Cache-Control': 'no-store' } }) } /** Schritt 2: Antwort des Browsers pruefen und den Passkey speichern. */ export async function POST(anfrage: Request) { const benutzer = await verlangeAnmeldungFuerApi() if (!benutzer) { return NextResponse.json({ fehler: 'Nicht angemeldet.' }, { status: 401 }) } let inhalt: unknown try { inhalt = await anfrage.json() } catch { return NextResponse.json({ fehler: 'Ungültige Anfrage.' }, { status: 400 }) } const gelesen = abschluss.safeParse(inhalt) if (!gelesen.success) { return NextResponse.json( { fehler: 'Bitte einen Namen für das Gerät angeben.' }, { status: 400 }, ) } try { const ergebnis = await registrierungPruefen( benutzer.id, gelesen.data.antwort as unknown as RegistrationResponseJSON, gelesen.data.bezeichnung, ) await auditSchreiben({ akteur: { id: benutzer.id, email: benutzer.email }, aktion: 'passkey.angelegt', objektTyp: 'Passkey', objektId: ergebnis.passkeyId, details: { bezeichnung: ergebnis.bezeichnung }, }) return NextResponse.json({ ok: true, bezeichnung: ergebnis.bezeichnung }) } catch (fehler) { const meldung = fehler instanceof Error ? fehler.message : 'Der Passkey konnte nicht gespeichert werden.' return NextResponse.json({ fehler: meldung }, { status: 400 }) } }