mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 14:21:46 +00:00
feat: Passkey (WebAuthn) login (#1111)
* feat(auth): passkey (WebAuthn) login — server endpoints, schema + admin toggle Add @simplewebauthn/server registration and primary (discoverable) login ceremonies under /api/auth/passkey, a webauthn_credentials + single-use webauthn_challenges schema (migration), the instance-wide passkey_login toggle (default off) enforced before auth by a guard, and require_mfa satisfaction via a verified passkey. RP ID/origin come only from server config (webauthn_rp_id/origins -> APP_URL), never request headers. * feat(auth): passkey enrolment, login button + admin settings UI PasskeysSection in account settings (add/rename/remove with a current-password step-up), a 'Sign in with a passkey' button on the login page, the admin enable + RP-ID/origins controls, and a per-user admin reset action. * i18n(auth): passkey strings across all locales Add login/settings/admin passkey keys to en and all 19 translated locales.
This commit is contained in:
@@ -361,5 +361,24 @@ const admin: TranslationStrings = {
|
||||
'admin.addons.catalog.journey.name': 'Journey',
|
||||
'admin.addons.catalog.journey.description':
|
||||
'Reise-Tracking & Tagebuch mit Check-ins, Fotos und Tagesberichten',
|
||||
'admin.passkey.title': 'Passkey-Anmeldung',
|
||||
'admin.passkey.cardHint':
|
||||
'Erlaube Benutzern die Anmeldung mit Passkeys (WebAuthn). Standardmäßig deaktiviert.',
|
||||
'admin.passkey.login': 'Passkey-Anmeldung aktivieren',
|
||||
'admin.passkey.loginHint':
|
||||
'Zeigt die Option "Mit Passkey anmelden" und erlaubt Benutzern, in ihren Einstellungen Passkeys zu registrieren.',
|
||||
'admin.passkey.notConfigured':
|
||||
'Für diese Installation ist noch keine WebAuthn-Domain auflösbar. Lege unten APP_URL oder die Relying Party ID fest — bis dahin bleiben Passkeys ausgeblendet.',
|
||||
'admin.passkey.rpId': 'Relying Party ID (Domain)',
|
||||
'admin.passkey.rpIdHint':
|
||||
'Die reine Domain, an die Passkeys gebunden sind, z. B. trek.example.org. Leer lassen, um sie aus APP_URL abzuleiten. Eine spätere Änderung macht bestehende Passkeys ungültig.',
|
||||
'admin.passkey.origins': 'Erlaubte Origins',
|
||||
'admin.passkey.originsHint':
|
||||
'Vollständige Origins, durch Komma getrennt, z. B. https://trek.example.org. Leer lassen, um APP_URL zu verwenden.',
|
||||
'admin.passkey.reset': 'Passkeys zurücksetzen',
|
||||
'admin.passkey.resetHint':
|
||||
'Entfernt alle Passkeys dieses Benutzers (z. B. bei einem verlorenen Gerät). Die Anmeldung mit Passwort bleibt weiterhin möglich.',
|
||||
'admin.passkey.resetConfirm': 'Alle Passkeys von {name} entfernen?',
|
||||
'admin.passkey.resetDone': '{count} Passkey(s) entfernt',
|
||||
};
|
||||
export default admin;
|
||||
|
||||
@@ -94,5 +94,8 @@ const login: TranslationStrings = {
|
||||
'Dieser Link fehlt oder ist beschädigt. Fordere einen neuen an, um fortzufahren.',
|
||||
'login.resetPasswordFailed':
|
||||
'Zurücksetzen fehlgeschlagen. Der Link ist möglicherweise abgelaufen.',
|
||||
'login.passkey.signIn': 'Mit Passkey anmelden',
|
||||
'login.passkey.failed':
|
||||
'Anmeldung mit Passkey fehlgeschlagen. Bitte erneut versuchen.',
|
||||
};
|
||||
export default login;
|
||||
|
||||
@@ -300,6 +300,30 @@ const settings: TranslationStrings = {
|
||||
'settings.notificationPreferences.ntfy': 'Ntfy',
|
||||
"settings.currency": "Währung",
|
||||
"settings.currencyHint": "Alle Beträge in Costs werden in diese Währung umgerechnet und angezeigt.",
|
||||
'settings.passkey.title': 'Passkeys',
|
||||
'settings.passkey.description':
|
||||
'Melde dich schneller und phishing-resistent mit einem Passkey an — per Fingerabdruck, Gesicht, PIN oder Hardware-Schlüssel. Dein Passwort bleibt als Backup erhalten.',
|
||||
'settings.passkey.notConfigured':
|
||||
'Passkeys sind aktiviert, aber auf diesem Server noch nicht vollständig eingerichtet. Bitte deinen Administrator, die WebAuthn-Domain festzulegen.',
|
||||
'settings.passkey.add': 'Passkey hinzufügen',
|
||||
'settings.passkey.addTitle': 'Passkey hinzufügen',
|
||||
'settings.passkey.passwordPrompt':
|
||||
'Bestätige dein aktuelles Passwort und folge dann der Aufforderung deines Geräts.',
|
||||
'settings.passkey.passwordRequired': 'Dein aktuelles Passwort wird benötigt.',
|
||||
'settings.passkey.namePlaceholder': 'Name (optional, z. B. "iPhone")',
|
||||
'settings.passkey.addedToast': 'Passkey hinzugefügt',
|
||||
'settings.passkey.added': 'Hinzugefügt',
|
||||
'settings.passkey.addError': 'Passkey konnte nicht hinzugefügt werden',
|
||||
'settings.passkey.cancelled': 'Passkey-Einrichtung abgebrochen',
|
||||
'settings.passkey.deleted': 'Passkey entfernt',
|
||||
'settings.passkey.deleteConfirm':
|
||||
'Diesen Passkey entfernen? Bestätige mit deinem Passwort.',
|
||||
'settings.passkey.rename': 'Umbenennen',
|
||||
'settings.passkey.defaultName': 'Passkey',
|
||||
'settings.passkey.synced': 'Synchronisiert',
|
||||
'settings.passkey.deviceBound': 'Dieses Gerät',
|
||||
'settings.passkey.lastUsed': 'Zuletzt verwendet',
|
||||
'settings.passkey.neverUsed': 'Noch nie verwendet',
|
||||
};
|
||||
|
||||
export default settings;
|
||||
|
||||
Reference in New Issue
Block a user