From af0276ce45d6127ebecde6b23604486ed29b2e81 Mon Sep 17 00:00:00 2001 From: Dustin Holz Date: Tue, 27 Jan 2026 11:02:54 +0100 Subject: [PATCH] feat: enhance error handling for passkey registration in use-lt-auth --- src/runtime/composables/auth/use-lt-auth.ts | 33 +++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/runtime/composables/auth/use-lt-auth.ts b/src/runtime/composables/auth/use-lt-auth.ts index 3e6e807..d4e450b 100644 --- a/src/runtime/composables/auth/use-lt-auth.ts +++ b/src/runtime/composables/auth/use-lt-auth.ts @@ -636,18 +636,39 @@ export function useLtAuth(): UseLtAuthReturn { return { success: true, passkey: result }; } catch (err: unknown) { - if (err instanceof Error && err.name === "NotAllowedError") { + if (err instanceof Error) { + // User cancelled the operation + if (err.name === "NotAllowedError") { + return { + success: false, + error: t("lt.auth.passkeyCreationAborted", "Passkey-Erstellung wurde abgebrochen"), + }; + } + + // Authenticator already has a credential for this user + // Some authenticators only allow one passkey per website per user + if ( + err.name === "InvalidStateError" || + err.message.includes("already registered") || + err.message.includes("credentials already registered") + ) { + return { + success: false, + error: t( + "lt.auth.passkeyAlreadyRegistered", + "Du hast bereits einen Passkey für diese Website registriert. Lösche ihn zuerst oder verwende einen anderen Authenticator.", + ), + }; + } + return { success: false, - error: t("lt.auth.passkeyCreationAborted", "Passkey-Erstellung wurde abgebrochen"), + error: err.message, }; } return { success: false, - error: - err instanceof Error - ? err.message - : t("lt.auth.passkeyRegisterFailed", "Passkey-Registrierung fehlgeschlagen"), + error: t("lt.auth.passkeyRegisterFailed", "Passkey-Registrierung fehlgeschlagen"), }; } finally { isLoading.value = false;