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:
@@ -349,5 +349,24 @@ const admin: TranslationStrings = {
|
||||
'admin.addons.catalog.journey.name': 'Journey',
|
||||
'admin.addons.catalog.journey.description':
|
||||
'체크인, 사진, 일별 이야기가 있는 여행 기록 및 여행 일지',
|
||||
'admin.passkey.title': '패스키 로그인',
|
||||
'admin.passkey.cardHint':
|
||||
'사용자가 패스키(WebAuthn)로 로그인할 수 있게 합니다. 기본값은 꺼짐입니다.',
|
||||
'admin.passkey.login': '패스키 로그인 활성화',
|
||||
'admin.passkey.loginHint':
|
||||
'"패스키로 로그인" 옵션을 표시하고 사용자가 설정에서 패스키를 등록할 수 있게 합니다.',
|
||||
'admin.passkey.notConfigured':
|
||||
'이 배포에 아직 WebAuthn 도메인이 확인되지 않습니다. 아래에서 APP_URL 또는 Relying Party ID를 설정하세요 — 그 전까지 패스키는 숨겨진 상태로 유지됩니다.',
|
||||
'admin.passkey.rpId': 'Relying Party ID (도메인)',
|
||||
'admin.passkey.rpIdHint':
|
||||
'패스키가 바인딩되는 순수 도메인입니다. 예: trek.example.org. 비워두면 APP_URL에서 자동으로 가져옵니다. 나중에 변경하면 기존 패스키가 무효화됩니다.',
|
||||
'admin.passkey.origins': '허용된 오리진',
|
||||
'admin.passkey.originsHint':
|
||||
'쉼표로 구분된 전체 오리진입니다. 예: https://trek.example.org. 비워두면 APP_URL을 사용합니다.',
|
||||
'admin.passkey.reset': '패스키 초기화',
|
||||
'admin.passkey.resetHint':
|
||||
'이 사용자의 모든 패스키를 삭제합니다 (예: 기기 분실 시). 사용자는 비밀번호로 계속 로그인할 수 있습니다.',
|
||||
'admin.passkey.resetConfirm': '{name}의 모든 패스키를 삭제할까요?',
|
||||
'admin.passkey.resetDone': '패스키 {count}개를 삭제했습니다',
|
||||
};
|
||||
export default admin;
|
||||
|
||||
@@ -89,5 +89,7 @@ const login: TranslationStrings = {
|
||||
'login.resetPasswordInvalidLinkBody':
|
||||
'이 링크가 없거나 손상되었습니다. 새 링크를 요청하세요.',
|
||||
'login.resetPasswordFailed': '재설정 실패. 링크가 만료되었을 수 있습니다.',
|
||||
'login.passkey.signIn': '패스키로 로그인',
|
||||
'login.passkey.failed': '패스키 로그인에 실패했습니다. 다시 시도하세요.',
|
||||
};
|
||||
export default login;
|
||||
|
||||
@@ -293,6 +293,30 @@ const settings: TranslationStrings = {
|
||||
'settings.oauth.badge.machine': '머신',
|
||||
"settings.currency": "Currency",
|
||||
"settings.currencyHint": "All amounts in Costs are converted to and shown in this currency.",
|
||||
'settings.passkey.title': '패스키',
|
||||
'settings.passkey.description':
|
||||
'지문, 얼굴, PIN 또는 하드웨어 키 같은 패스키로 더 빠르고 피싱에 강하게 로그인하세요. 비밀번호는 백업으로 그대로 유지됩니다.',
|
||||
'settings.passkey.notConfigured':
|
||||
'패스키가 활성화되어 있지만 이 서버에 아직 완전히 설정되지 않았습니다. 관리자에게 WebAuthn 도메인 설정을 요청하세요.',
|
||||
'settings.passkey.add': '패스키 추가',
|
||||
'settings.passkey.addTitle': '패스키 추가',
|
||||
'settings.passkey.passwordPrompt':
|
||||
'현재 비밀번호를 확인한 뒤 기기 안내에 따라 진행하세요.',
|
||||
'settings.passkey.passwordRequired': '현재 비밀번호가 필요합니다.',
|
||||
'settings.passkey.namePlaceholder': '이름 (선택, 예: "iPhone")',
|
||||
'settings.passkey.addedToast': '패스키가 추가되었습니다',
|
||||
'settings.passkey.added': '추가됨',
|
||||
'settings.passkey.addError': '패스키를 추가할 수 없습니다',
|
||||
'settings.passkey.cancelled': '패스키 설정이 취소되었습니다',
|
||||
'settings.passkey.deleted': '패스키가 삭제되었습니다',
|
||||
'settings.passkey.deleteConfirm':
|
||||
'이 패스키를 삭제할까요? 비밀번호로 확인하세요.',
|
||||
'settings.passkey.rename': '이름 변경',
|
||||
'settings.passkey.defaultName': '패스키',
|
||||
'settings.passkey.synced': '동기화됨',
|
||||
'settings.passkey.deviceBound': '이 기기',
|
||||
'settings.passkey.lastUsed': '마지막 사용',
|
||||
'settings.passkey.neverUsed': '사용한 적 없음',
|
||||
};
|
||||
|
||||
export default settings;
|
||||
|
||||
Reference in New Issue
Block a user