mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 22:31: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:
@@ -326,5 +326,23 @@ const admin: TranslationStrings = {
|
||||
'admin.addons.catalog.journey.name': '旅程',
|
||||
'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;
|
||||
|
||||
@@ -83,5 +83,7 @@ const login: TranslationStrings = {
|
||||
'login.oidcOnly': '密码登录已关闭。请通过 SSO 提供商登录。',
|
||||
'login.oidcLoggedOut': '您已退出登录。请重新通过 SSO 提供商登录。',
|
||||
'login.demoHint': '试用演示——无需注册',
|
||||
'login.passkey.signIn': '使用通行密钥登录',
|
||||
'login.passkey.failed': '通行密钥登录失败,请重试。',
|
||||
};
|
||||
export default login;
|
||||
|
||||
@@ -283,6 +283,28 @@ const settings: TranslationStrings = {
|
||||
'settings.notificationPreferences.ntfy': 'Ntfy',
|
||||
"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