From fde25d92c5775f895fd48b20106ab4607aeb0404 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 7 Jan 2026 18:37:01 +0100 Subject: [PATCH] Implement passkey recovery feature, including email link requests and registration options. Update login and registration pages to support passkey authentication, with UI enhancements for user experience. Add server-side handling for passkey registration and login, including account activation checks. Update environment configuration for passkey recovery TTL settings. --- DATENSCHUTZ_UEBERSICHT.md | 10 + env.example | 4 + pages/login.vue | 10 +- pages/passkey-wiederherstellen.vue | 190 ++++++++++++++++++ pages/registrieren.vue | 73 ++++++- server/api/auth/passkeys/login.post.js | 8 + .../auth/passkeys/recovery/complete.post.js | 120 +++++++++++ .../api/auth/passkeys/recovery/options.get.js | 89 ++++++++ .../auth/passkeys/recovery/request.post.js | 100 +++++++++ .../api/auth/register-passkey-options.post.js | 60 ++++++ server/api/auth/register-passkey.post.js | 147 ++++++++++++++ server/utils/passkey-recovery.js | 21 ++ server/utils/webauthn-challenges.js | 16 ++ 13 files changed, 843 insertions(+), 5 deletions(-) create mode 100644 pages/passkey-wiederherstellen.vue create mode 100644 server/api/auth/passkeys/recovery/complete.post.js create mode 100644 server/api/auth/passkeys/recovery/options.get.js create mode 100644 server/api/auth/passkeys/recovery/request.post.js create mode 100644 server/api/auth/register-passkey-options.post.js create mode 100644 server/api/auth/register-passkey.post.js create mode 100644 server/utils/passkey-recovery.js diff --git a/DATENSCHUTZ_UEBERSICHT.md b/DATENSCHUTZ_UEBERSICHT.md index 0d6c3b4..b107ae8 100644 --- a/DATENSCHUTZ_UEBERSICHT.md +++ b/DATENSCHUTZ_UEBERSICHT.md @@ -166,6 +166,16 @@ - `GET /api/auth/passkeys/list` - `POST /api/auth/passkeys/remove` +### Passkey-Recovery (E-Mail-Link): + +- **Ziel**: Wenn der Passkey verloren geht (neues Gerät/Crash), kann ein neuer Passkey **hinzugefügt** werden. +- **Sicherheitsannahme**: Zugriff auf das E-Mail-Postfach gilt als Recovery-Faktor (Account-Übernahme möglich bei kompromittierter Mailbox). +- **Ablauf**: + - Request: `POST /api/auth/passkeys/recovery/request` (sendet Link; keine Account-Enumeration) + - Options: `GET /api/auth/passkeys/recovery/options?token=...` + - Complete: `POST /api/auth/passkeys/recovery/complete` +- **Eigenschaften**: Token ist kurzlebig (TTL), serverseitig nur gehasht gespeichert, one-time-use, rate-limited, audit-logged. + --- ## 🛡️ API-Endpunkte & Zugriffsschutz diff --git a/env.example b/env.example index 5754d62..e10cccd 100644 --- a/env.example +++ b/env.example @@ -66,3 +66,7 @@ WEBAUTHN_RP_ID= WEBAUTHN_RP_NAME=Harheimer TC # Optional: erzwingt User Verification (z.B. biometrisch/PIN am Gerät) WEBAUTHN_REQUIRE_UV=false + +# Passkey-Recovery (E-Mail-Link) +# TTL in Minuten (Standard: 30) +PASSKEY_RECOVERY_TTL_MIN=30 diff --git a/pages/login.vue b/pages/login.vue index f8f0dc0..8594a82 100644 --- a/pages/login.vue +++ b/pages/login.vue @@ -115,13 +115,21 @@ -
+
Passwort vergessen? +
+ + Passkey verloren? Wiederherstellen + +
diff --git a/pages/passkey-wiederherstellen.vue b/pages/passkey-wiederherstellen.vue new file mode 100644 index 0000000..ef3ae09 --- /dev/null +++ b/pages/passkey-wiederherstellen.vue @@ -0,0 +1,190 @@ + + + + diff --git a/pages/registrieren.vue b/pages/registrieren.vue index 6a3bdb3..f5fbaaf 100644 --- a/pages/registrieren.vue +++ b/pages/registrieren.vue @@ -13,8 +13,20 @@
+ +
+
+
Registrierungsmethode
+
Passkey = Anmeldung ohne Passwort (z.B. FaceID/TouchID/Windows Hello)
+
+ +
+