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();