refine passkey prerequisite checks and i18n guidance

This commit is contained in:
ssongliu
2026-03-03 17:08:06 +08:00
parent 475e4ca629
commit 7fa9754ce7
11 changed files with 138 additions and 31 deletions
+10 -3
View File
@@ -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',
+11 -3
View File
@@ -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',
+11 -3
View File
@@ -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: '現在の環境が PasskeyWebAuthn + プラットフォーム認証器に対応',
passkeyPrereqBrowserDetailWebAuthnUnavailable:
'システムブラウザでアクセスしドメイン設定済みかつ HTTPS で開いていることを確認してください',
passkeyPrereqBrowserDetailPlatformCapabilityUnavailable:
'この環境ではデバイス認証を利用できません新しい OS のシステムブラウザでお試しください',
passkeyPrereqBrowserDetailNoPlatformAuthenticator:
'画面ロック/指紋/Face ID/Windows Hello を有効化してから再試行してください',
passkeyPrereqBrowserDetailDetectFailed:
'環境検出に失敗しましたページを更新して再試行するかシステムブラウザをご利用ください',
passkeyPrereqGoSetup: '設定する',
passkeyCount: '登録済み {0}/{1}',
passkeyName: '名称',
+11 -3
View File
@@ -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: '이름',
+11 -3
View File
@@ -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',
+11 -3
View File
@@ -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',
+11 -3
View File
@@ -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: 'Название',
+11 -3
View File
@@ -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',
+9 -3
View File
@@ -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: '目前環境支援 PasskeyWebAuthn + 平台驗證器',
passkeyPrereqBrowserDetailWebAuthnUnavailable: '請使用系統瀏覽器存取並確認已綁定網域且透過 HTTPS 開啟面板',
passkeyPrereqBrowserDetailPlatformCapabilityUnavailable:
'目前環境無法使用裝置認證請改用系統瀏覽器並確認系統版本較新',
passkeyPrereqBrowserDetailNoPlatformAuthenticator:
'請先在系統中啟用螢幕鎖定/指紋/臉部辨識/Windows Hello 後重試',
passkeyPrereqBrowserDetailDetectFailed: '環境檢測失敗請重新整理後重試或改用系統瀏覽器存取',
passkeyPrereqGoSetup: '去設定',
passkeyCount: '已綁定 {0}/{1}',
passkeyName: '名稱',
+8 -3
View File
@@ -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: '当前环境支持 PasskeyWebAuthn + 平台认证器',
passkeyPrereqBrowserDetailWebAuthnUnavailable: '请使用系统浏览器访问并确认已绑定域名且通过 HTTPS 打开面板',
passkeyPrereqBrowserDetailPlatformCapabilityUnavailable:
'当前环境无法使用设备认证请改用系统浏览器并确认系统版本较新',
passkeyPrereqBrowserDetailNoPlatformAuthenticator: '请先在系统中启用屏幕锁/指纹/面容/Windows Hello 后重试',
passkeyPrereqBrowserDetailDetectFailed: '环境检测失败请刷新页面重试或改用系统浏览器访问',
passkeyPrereqGoSetup: '去设置',
passkeyCount: '已绑定 {0}/{1}',
passkeyName: '名称',
@@ -33,6 +33,9 @@
<Close v-else />
</el-icon>
<span>{{ $t('setting.passkeyPrereqBrowser') }}</span>
<span v-if="!prereqBrowser && prereqBrowserDetail" class="text-xs text-gray-500">
{{ prereqBrowserDetail }}
</span>
</div>
</div>
</template>
@@ -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();