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:
@@ -370,5 +370,24 @@ const admin: TranslationStrings = {
|
||||
'admin.addons.catalog.journey.name': 'Ταξίδι',
|
||||
'admin.addons.catalog.journey.description':
|
||||
'Παρακολούθηση ταξιδιών & ημερολόγιο ταξιδιών με αφίξεις, φωτογραφίες και καθημερινές ιστορίες',
|
||||
'admin.passkey.title': 'Σύνδεση με passkey',
|
||||
'admin.passkey.cardHint':
|
||||
'Επιτρέψτε στους χρήστες να συνδέονται με passkeys (WebAuthn). Απενεργοποιημένο από προεπιλογή.',
|
||||
'admin.passkey.login': 'Ενεργοποίηση σύνδεσης με passkey',
|
||||
'admin.passkey.loginHint':
|
||||
'Εμφανίστε μια επιλογή "Σύνδεση με passkey" και επιτρέψτε στους χρήστες να καταχωρούν passkeys στις ρυθμίσεις τους.',
|
||||
'admin.passkey.notConfigured':
|
||||
'Δεν αναλύεται ακόμη κανένας τομέας WebAuthn για αυτή την εγκατάσταση. Ορίστε το APP_URL ή το Relying Party ID παρακάτω — τα passkeys παραμένουν κρυφά μέχρι τότε.',
|
||||
'admin.passkey.rpId': 'Relying Party ID (τομέας)',
|
||||
'admin.passkey.rpIdHint':
|
||||
'Ο σκέτος τομέας στον οποίο δεσμεύονται τα passkeys, π.χ. trek.example.org. Αφήστε το κενό για να παραχθεί από το APP_URL. Η μεταγενέστερη αλλαγή του ακυρώνει τα υπάρχοντα passkeys.',
|
||||
'admin.passkey.origins': 'Επιτρεπόμενες προελεύσεις',
|
||||
'admin.passkey.originsHint':
|
||||
'Πλήρεις προελεύσεις χωρισμένες με κόμμα, π.χ. https://trek.example.org. Αφήστε το κενό για χρήση του APP_URL.',
|
||||
'admin.passkey.reset': 'Επαναφορά passkeys',
|
||||
'admin.passkey.resetHint':
|
||||
'Αφαιρέστε όλα τα passkeys αυτού του χρήστη (π.χ. σε περίπτωση χαμένης συσκευής). Μπορούν ακόμη να συνδεθούν με τον κωδικό τους.',
|
||||
'admin.passkey.resetConfirm': 'Αφαίρεση όλων των passkeys για τον/την {name};',
|
||||
'admin.passkey.resetDone': 'Αφαιρέθηκαν {count} passkey(s)',
|
||||
};
|
||||
export default admin;
|
||||
|
||||
@@ -99,5 +99,8 @@ const login: TranslationStrings = {
|
||||
'Αυτός ο σύνδεσμος λείπει ή έχει χαλάσει. Ζητήστε έναν νέο για να συνεχίσετε.',
|
||||
'login.resetPasswordFailed':
|
||||
'Η επαναφορά απέτυχε. Ο σύνδεσμος μπορεί να έχει λήξει.',
|
||||
'login.passkey.signIn': 'Σύνδεση με passkey',
|
||||
'login.passkey.failed':
|
||||
'Η σύνδεση με passkey απέτυχε. Παρακαλώ δοκιμάστε ξανά.',
|
||||
};
|
||||
export default login;
|
||||
|
||||
@@ -303,6 +303,30 @@ const settings: TranslationStrings = {
|
||||
'settings.mfa.demoBlocked': 'Δεν είναι διαθέσιμο σε λειτουργία demo',
|
||||
"settings.currency": "Currency",
|
||||
"settings.currencyHint": "All amounts in Costs are converted to and shown in this currency.",
|
||||
'settings.passkey.title': 'Passkeys',
|
||||
'settings.passkey.description':
|
||||
'Συνδεθείτε πιο γρήγορα και με προστασία από phishing χρησιμοποιώντας ένα passkey — το δαχτυλικό σας αποτύπωμα, το πρόσωπό σας, ένα PIN ή ένα κλειδί υλικού. Ο κωδικός σας παραμένει ως εφεδρεία.',
|
||||
'settings.passkey.notConfigured':
|
||||
'Τα passkeys είναι ενεργοποιημένα αλλά δεν έχουν διαμορφωθεί πλήρως σε αυτόν τον server ακόμη. Ζητήστε από τον διαχειριστή σας να ορίσει τον τομέα WebAuthn.',
|
||||
'settings.passkey.add': 'Προσθήκη passkey',
|
||||
'settings.passkey.addTitle': 'Προσθήκη passkey',
|
||||
'settings.passkey.passwordPrompt':
|
||||
'Επιβεβαιώστε τον τρέχοντα κωδικό σας και έπειτα ακολουθήστε τις οδηγίες της συσκευής σας.',
|
||||
'settings.passkey.passwordRequired': 'Ο τρέχων κωδικός σας είναι υποχρεωτικός.',
|
||||
'settings.passkey.namePlaceholder': 'Όνομα (προαιρετικό, π.χ. "iPhone")',
|
||||
'settings.passkey.addedToast': 'Το passkey προστέθηκε',
|
||||
'settings.passkey.added': 'Προστέθηκε',
|
||||
'settings.passkey.addError': 'Δεν ήταν δυνατή η προσθήκη του passkey',
|
||||
'settings.passkey.cancelled': 'Η ρύθμιση του passkey ακυρώθηκε',
|
||||
'settings.passkey.deleted': 'Το passkey αφαιρέθηκε',
|
||||
'settings.passkey.deleteConfirm':
|
||||
'Αφαίρεση αυτού του passkey; Επιβεβαιώστε με τον κωδικό σας.',
|
||||
'settings.passkey.rename': 'Μετονομασία',
|
||||
'settings.passkey.defaultName': 'Passkey',
|
||||
'settings.passkey.synced': 'Συγχρονισμένο',
|
||||
'settings.passkey.deviceBound': 'Αυτή η συσκευή',
|
||||
'settings.passkey.lastUsed': 'Τελευταία χρήση',
|
||||
'settings.passkey.neverUsed': 'Δεν χρησιμοποιήθηκε ποτέ',
|
||||
};
|
||||
|
||||
export default settings;
|
||||
|
||||
Reference in New Issue
Block a user