/** * Browserseitige Hilfen fuer Passkeys. * * Bewusst ohne "server-only" und ohne Datenbankzugriff: Diese Datei laeuft * im Browser. Die eigentliche Pruefung passiert auf dem Server * (src/lib/auth/passkey.ts) - hier geht es nur darum, das Geraet * anzusprechen und seine Fehler in verstaendliche Saetze zu uebersetzen. */ import { browserSupportsWebAuthn, startAuthentication, startRegistration, } from '@simplewebauthn/browser' export { browserSupportsWebAuthn, startAuthentication, startRegistration } /** * Uebersetzt die Ausnahmen der WebAuthn-Schnittstelle. * * Der Browser wirft DOMExceptions mit sehr knappen Namen und einer * englischen Beschreibung, die man niemandem zeigen kann. Vor allem * "NotAllowedError" ist irrefuehrend: Er bedeutet meistens schlicht, dass * der Vorgang abgebrochen wurde oder die Zeit abgelaufen ist - nicht, dass * etwas verboten waere. */ export function passkeyBrowserfehler(fehler: unknown, beimEinrichten = false): string { const name = fehler instanceof Error ? fehler.name : '' switch (name) { case 'NotAllowedError': return 'Abgebrochen oder zu lange gewartet. Du kannst es gleich noch einmal versuchen.' case 'InvalidStateError': return beimEinrichten ? 'Für dieses Gerät ist hier bereits ein Passkey hinterlegt. Ein zweiter bringt nichts — ' + 'nimm ein anderes Gerät oder entferne zuerst den vorhandenen.' : 'Dieses Gerät kann den Passkey gerade nicht verwenden.' case 'SecurityError': return ( 'Die Adresse im Browser passt nicht zu der, für die der Passkey ausgestellt wurde. ' + 'Das ist genau der Schutz, der Phishing verhindert — prüfe die Adresszeile.' ) case 'NotSupportedError': return 'Dieses Gerät unterstützt keine Passkeys mit Fingerabdruck, Gesicht oder PIN.' case 'AbortError': return 'Abgebrochen.' default: return 'Der Passkey konnte nicht verwendet werden. Bitte versuche es noch einmal.' } }