diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 0c2b3887e..8f0ef3879 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1995,9 +1995,16 @@ const message = { 'Only requests from these IP/CIDR sources will trust Forwarded and X-Forwarded-Proto when determining HTTPS', passkeyNotSupported: 'Current browser or environment does not support passkeys', passkeyPrereqTitle: 'The following prerequisites are required for Passkey', - passkeyPrereqBindDomain: 'Domain name configured', - passkeyPrereqHttps: 'HTTPS / Secure context', - passkeyPrereqBrowser: 'Browser supports WebAuthn', + passkeyPrereqBindDomain: '1Panel domain binding configured', + passkeyPrereqHttps: 'Accessed securely via HTTPS', + passkeyPrereqBrowser: 'Environment supports Passkey (WebAuthn + platform authenticator)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Use a system browser and make sure the panel is opened over HTTPS with a bound domain.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'This environment cannot use device authentication. Try a system browser on a newer OS version.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + 'Enable screen lock / fingerprint / face unlock / Windows Hello, then try again.', + passkeyPrereqBrowserDetailDetectFailed: 'Detection failed. Refresh and retry, or switch to a system browser.', passkeyPrereqGoSetup: 'Configure', passkeyCount: 'Bound {0}/{1}', passkeyName: 'Name', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index a5bc9e895..469197e0f 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -2016,9 +2016,17 @@ const message = { 'Solo las solicitudes desde estas IP/CIDR confiarán en Forwarded y X-Forwarded-Proto para detectar HTTPS', passkeyNotSupported: 'El navegador o entorno actual no admite passkeys', passkeyPrereqTitle: 'Se requieren los siguientes requisitos previos para Passkey', - passkeyPrereqBindDomain: 'Nombre de dominio configurado', - passkeyPrereqHttps: 'HTTPS / Contexto seguro', - passkeyPrereqBrowser: 'El navegador admite WebAuthn', + passkeyPrereqBindDomain: 'Vinculación de dominio de 1Panel configurada', + passkeyPrereqHttps: 'Acceso seguro mediante HTTPS', + passkeyPrereqBrowser: 'El entorno admite Passkey (WebAuthn + autenticador de plataforma)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Usa un navegador del sistema y confirma que el panel se abre por HTTPS con un dominio vinculado.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'Este entorno no puede usar autenticación del dispositivo. Prueba un navegador del sistema en una versión más nueva del SO.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + 'Activa bloqueo de pantalla / huella / reconocimiento facial / Windows Hello y vuelve a intentarlo.', + passkeyPrereqBrowserDetailDetectFailed: + 'La detección falló. Recarga la página y vuelve a intentarlo, o cambia a un navegador del sistema.', passkeyPrereqGoSetup: 'Configurar', passkeyCount: 'Vinculadas {0}/{1}', passkeyName: 'Nombre', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 6f3e1d67b..c6b720a41 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1946,9 +1946,17 @@ const message = { '以下の IP/CIDR からのリクエストのみが Forwarded/X-Forwarded-Proto を HTTPS 判定に使います', passkeyNotSupported: 'ブラウザまたは環境がパスキー非対応です。ドメインと HTTPS を確認してください', passkeyPrereqTitle: 'Passkey を使用するには次の前提条件が必要です', - passkeyPrereqBindDomain: 'ドメイン名が設定済み', - passkeyPrereqHttps: 'HTTPS / セキュアコンテキスト', - passkeyPrereqBrowser: 'ブラウザが WebAuthn をサポート', + passkeyPrereqBindDomain: '1Panel のドメインバインド設定済み', + passkeyPrereqHttps: 'HTTPS で安全にアクセス済み', + passkeyPrereqBrowser: '現在の環境が Passkey(WebAuthn + プラットフォーム認証器)に対応', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'システムブラウザでアクセスし、ドメイン設定済みかつ HTTPS で開いていることを確認してください', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'この環境ではデバイス認証を利用できません。新しい OS のシステムブラウザでお試しください', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + '画面ロック/指紋/Face ID/Windows Hello を有効化してから再試行してください', + passkeyPrereqBrowserDetailDetectFailed: + '環境検出に失敗しました。ページを更新して再試行するか、システムブラウザをご利用ください', passkeyPrereqGoSetup: '設定する', passkeyCount: '登録済み {0}/{1}', passkeyName: '名称', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 0897c86ab..d1229d917 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1920,9 +1920,17 @@ const message = { '이 IP/CIDR 출처의 요청만 Forwarded와 X-Forwarded-Proto 헤더를 HTTPS 판단에 사용합니다', passkeyNotSupported: '브라우저/환경이 패스키를 지원하지 않습니다. 도메인과 HTTPS를 확인하세요', passkeyPrereqTitle: 'Passkey 사용을 위해 다음 전제 조건이 필요합니다', - passkeyPrereqBindDomain: '도메인 이름 구성됨', - passkeyPrereqHttps: 'HTTPS / 보안 컨텍스트', - passkeyPrereqBrowser: '브라우저가 WebAuthn을 지원합니다', + passkeyPrereqBindDomain: '1Panel 도메인 바인딩 구성됨', + passkeyPrereqHttps: 'HTTPS를 통해 안전하게 접속됨', + passkeyPrereqBrowser: '현재 환경이 Passkey를 지원합니다 (WebAuthn + 플랫폼 인증기)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + '시스템 브라우저로 접속하고, 바인딩된 도메인으로 HTTPS에서 패널을 열었는지 확인하세요.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + '현재 환경에서는 기기 인증을 사용할 수 없습니다. 더 최신 OS의 시스템 브라우저에서 시도하세요.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + '화면 잠금/지문/얼굴 인식/Windows Hello를 활성화한 뒤 다시 시도하세요.', + passkeyPrereqBrowserDetailDetectFailed: + '감지에 실패했습니다. 페이지를 새로고침 후 다시 시도하거나 시스템 브라우저로 전환하세요.', passkeyPrereqGoSetup: '설정', passkeyCount: '등록됨 {0}/{1}', passkeyName: '이름', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index aeea1652b..420e24dc7 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -2000,9 +2000,17 @@ const message = { 'Hanya permintaan daripada IP/CIDR ini akan mempercayai Forwarded dan X-Forwarded-Proto untuk menentukan HTTPS', passkeyNotSupported: 'Pelayar atau persekitaran semasa tidak menyokong passkey', passkeyPrereqTitle: 'Prasyarat berikut diperlukan untuk Passkey', - passkeyPrereqBindDomain: 'Nama domain dikonfigurasi', - passkeyPrereqHttps: 'HTTPS / Konteks selamat', - passkeyPrereqBrowser: 'Pelayar menyokong WebAuthn', + passkeyPrereqBindDomain: 'Pengikatan domain 1Panel dikonfigurasi', + passkeyPrereqHttps: 'Akses selamat melalui HTTPS', + passkeyPrereqBrowser: 'Persekitaran menyokong Passkey (WebAuthn + pengesah platform)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Gunakan pelayar sistem dan pastikan panel dibuka melalui HTTPS dengan domain yang telah diikat.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'Persekitaran ini tidak boleh menggunakan pengesahan peranti. Cuba pelayar sistem pada versi OS yang lebih baharu.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + 'Aktifkan kunci skrin / cap jari / pengecaman wajah / Windows Hello, kemudian cuba lagi.', + passkeyPrereqBrowserDetailDetectFailed: + 'Pengesanan gagal. Muat semula dan cuba lagi, atau tukar ke pelayar sistem.', passkeyPrereqGoSetup: 'Konfigurasi', passkeyCount: 'Dipaut {0}/{1}', passkeyName: 'Nama', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 6d834e3e4..55f665f3f 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1987,9 +1987,17 @@ const message = { 'Somente requisições originadas nesses IP/CIDR confiarão em Forwarded e X-Forwarded-Proto para detectar HTTPS', passkeyNotSupported: 'O navegador ou ambiente atual não suporta passkeys', passkeyPrereqTitle: 'Os seguintes pré-requisitos são necessários para Passkey', - passkeyPrereqBindDomain: 'Nome de domínio configurado', - passkeyPrereqHttps: 'HTTPS / Contexto seguro', - passkeyPrereqBrowser: 'Navegador suporta WebAuthn', + passkeyPrereqBindDomain: 'Vinculação de domínio do 1Panel configurada', + passkeyPrereqHttps: 'Acesso seguro via HTTPS', + passkeyPrereqBrowser: 'O ambiente suporta Passkey (WebAuthn + autenticador de plataforma)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Use um navegador do sistema e confirme que o painel está aberto em HTTPS com domínio vinculado.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'Este ambiente não pode usar autenticação do dispositivo. Tente um navegador do sistema em uma versão mais nova do SO.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + 'Ative bloqueio de tela / impressão digital / reconhecimento facial / Windows Hello e tente novamente.', + passkeyPrereqBrowserDetailDetectFailed: + 'Falha na detecção. Atualize a página e tente novamente, ou troque para um navegador do sistema.', passkeyPrereqGoSetup: 'Configurar', passkeyCount: 'Vinculadas {0}/{1}', passkeyName: 'Nome', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 35ba85d38..4fc529c6c 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1987,9 +1987,17 @@ const message = { 'Только запросы с этих IP/CIDR будут доверять заголовкам Forwarded и X-Forwarded-Proto при определении HTTPS', passkeyNotSupported: 'Текущий браузер или среда не поддерживает passkey; проверьте домен и HTTPS', passkeyPrereqTitle: 'Для использования Passkey необходимо выполнить следующие условия', - passkeyPrereqBindDomain: 'Домен настроен', - passkeyPrereqHttps: 'HTTPS / Безопасный контекст', - passkeyPrereqBrowser: 'Браузер поддерживает WebAuthn', + passkeyPrereqBindDomain: 'Настроена привязка домена 1Panel', + passkeyPrereqHttps: 'Безопасный доступ по HTTPS', + passkeyPrereqBrowser: 'Среда поддерживает Passkey (WebAuthn + платформенный аутентификатор)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Используйте системный браузер и убедитесь, что панель открыта по HTTPS с привязанным доменом.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'В этой среде нельзя использовать аутентификацию устройства. Попробуйте системный браузер на более новой версии ОС.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + 'Включите блокировку экрана / отпечаток / Face ID / Windows Hello и повторите попытку.', + passkeyPrereqBrowserDetailDetectFailed: + 'Не удалось выполнить проверку. Обновите страницу и попробуйте снова или перейдите в системный браузер.', passkeyPrereqGoSetup: 'Настроить', passkeyCount: 'Привязано {0}/{1}', passkeyName: 'Название', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 8dd27e11e..16ee10f21 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -2024,9 +2024,17 @@ const message = { 'Sadece bu IP/CIDR kaynaklarından gelen isteklerde Forwarded ve X-Forwarded-Proto HTTPS belirlenmesinde kullanılır', passkeyNotSupported: 'Tarayıcı/ortam passkey desteklemiyor; alan adı ve HTTPS erişimini doğrulayın', passkeyPrereqTitle: 'Passkey için aşağıdaki ön koşullar gereklidir', - passkeyPrereqBindDomain: 'Alan adı yapılandırıldı', - passkeyPrereqHttps: 'HTTPS / Güvenli bağlam', - passkeyPrereqBrowser: 'Tarayıcı WebAuthn destekliyor', + passkeyPrereqBindDomain: '1Panel alan adı bağlama yapılandırıldı', + passkeyPrereqHttps: 'HTTPS üzerinden güvenli erişim sağlandı', + passkeyPrereqBrowser: 'Ortam Passkey destekliyor (WebAuthn + platform doğrulayıcı)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: + 'Sistem tarayıcısı kullanın ve panelin HTTPS üzerinden, bağlı bir alan adıyla açıldığını doğrulayın.', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + 'Bu ortam cihaz kimlik doğrulamasını kullanamıyor. Daha yeni bir işletim sisteminde sistem tarayıcısını deneyin.', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + "Ekran kilidi / parmak izi / yüz tanıma / Windows Hello'yu etkinleştirip tekrar deneyin.", + passkeyPrereqBrowserDetailDetectFailed: + 'Algılama başarısız oldu. Sayfayı yenileyip tekrar deneyin veya sistem tarayıcısına geçin.', passkeyPrereqGoSetup: 'Yapılandır', passkeyCount: 'Bağlı {0}/{1}', passkeyName: 'Ad', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index ef0330c2c..ac1f0ba50 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1964,9 +1964,15 @@ const message = { '僅當請求來源命中以下 IP/CIDR 時,才會信任 Forwarded 與 X-Forwarded-Proto 判斷 HTTPS', passkeyNotSupported: '目前瀏覽器或環境不支援通行金鑰,請確認網域與 HTTPS', passkeyPrereqTitle: '使用通行金鑰需滿足以下前置條件', - passkeyPrereqBindDomain: '已綁定網域', - passkeyPrereqHttps: 'HTTPS 安全上下文', - passkeyPrereqBrowser: '瀏覽器支援 WebAuthn', + passkeyPrereqBindDomain: '已設定 1Panel 網域綁定', + passkeyPrereqHttps: '已透過 HTTPS 安全存取', + passkeyPrereqBrowser: '目前環境支援 Passkey(WebAuthn + 平台驗證器)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: '請使用系統瀏覽器存取,並確認已綁定網域且透過 HTTPS 開啟面板', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + '目前環境無法使用裝置認證,請改用系統瀏覽器並確認系統版本較新', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: + '請先在系統中啟用螢幕鎖定/指紋/臉部辨識/Windows Hello 後重試', + passkeyPrereqBrowserDetailDetectFailed: '環境檢測失敗,請重新整理後重試,或改用系統瀏覽器存取', passkeyPrereqGoSetup: '去設定', passkeyCount: '已綁定 {0}/{1}', passkeyName: '名稱', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 207a8935e..82b36f2ef 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1983,9 +1983,14 @@ const message = { passkeyTrustedProxiesHelper: '仅当请求来源命中以下 IP/CIDR 时,才信任 Forwarded 与 X-Forwarded-Proto 头', passkeyNotSupported: '当前浏览器或环境不支持通行密钥', passkeyPrereqTitle: '使用通行密钥需满足以下前置条件', - passkeyPrereqBindDomain: '已绑定域名', - passkeyPrereqHttps: 'HTTPS 安全上下文', - passkeyPrereqBrowser: '浏览器支持 WebAuthn', + passkeyPrereqBindDomain: '已设置 1Panel 域名绑定', + passkeyPrereqHttps: '已通过 HTTPS 安全访问', + passkeyPrereqBrowser: '当前环境支持 Passkey(WebAuthn + 平台认证器)', + passkeyPrereqBrowserDetailWebAuthnUnavailable: '请使用系统浏览器访问,并确认已绑定域名且通过 HTTPS 打开面板', + passkeyPrereqBrowserDetailPlatformCapabilityUnavailable: + '当前环境无法使用设备认证,请改用系统浏览器并确认系统版本较新', + passkeyPrereqBrowserDetailNoPlatformAuthenticator: '请先在系统中启用屏幕锁/指纹/面容/Windows Hello 后重试', + passkeyPrereqBrowserDetailDetectFailed: '环境检测失败,请刷新页面重试,或改用系统浏览器访问', passkeyPrereqGoSetup: '去设置', passkeyCount: '已绑定 {0}/{1}', passkeyName: '名称', diff --git a/frontend/src/views/setting/safe/passkey/index.vue b/frontend/src/views/setting/safe/passkey/index.vue index 6f6ec7eb6..76f566e3a 100644 --- a/frontend/src/views/setting/safe/passkey/index.vue +++ b/frontend/src/views/setting/safe/passkey/index.vue @@ -33,6 +33,9 @@ {{ $t('setting.passkeyPrereqBrowser') }} + + {{ prereqBrowserDetail }} + @@ -135,7 +138,14 @@ const passkeyMaxCount = 5; const prereqBindDomain = computed(() => hasBindDomain.value); const prereqHttps = computed(() => window.isSecureContext); -const prereqBrowser = computed(() => !!window.PublicKeyCredential); +const prereqBrowser = ref(false); +const prereqBrowserDetailKey = ref(''); +const prereqBrowserDetail = computed(() => { + if (!prereqBrowserDetailKey.value) { + return ''; + } + return i18n.global.t(prereqBrowserDetailKey.value); +}); const allPrerequisitesMet = computed(() => prereqBindDomain.value && prereqHttps.value && prereqBrowser.value); const passkeyCountText = computed(() => { @@ -148,8 +158,31 @@ const canRegisterPasskey = computed(() => { ); }); +const checkPasskeyBrowserSupport = async () => { + prereqBrowser.value = false; + prereqBrowserDetailKey.value = ''; + const credentialApi = window.PublicKeyCredential; + if (!credentialApi) { + prereqBrowserDetailKey.value = 'setting.passkeyPrereqBrowserDetailWebAuthnUnavailable'; + return; + } + if (typeof credentialApi.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') { + prereqBrowserDetailKey.value = 'setting.passkeyPrereqBrowserDetailPlatformCapabilityUnavailable'; + return; + } + try { + prereqBrowser.value = await credentialApi.isUserVerifyingPlatformAuthenticatorAvailable(); + if (!prereqBrowser.value) { + prereqBrowserDetailKey.value = 'setting.passkeyPrereqBrowserDetailNoPlatformAuthenticator'; + } + } catch (error) { + prereqBrowserDetailKey.value = 'setting.passkeyPrereqBrowserDetailDetectFailed'; + } +}; + const acceptParams = async (params: DrawerParams) => { hasBindDomain.value = params.bindDomain.trim().length > 0; + await checkPasskeyBrowserSupport(); drawerVisible.value = true; await loadPasskeyTrustedProxies(); await loadPasskeys();