Chrome/Chromium中使用Resident Key且无需用户验证的WebAuthn问题
解决方案
首先,你的代码存在参数冗余和潜在冲突问题,先调整核心参数并优化逻辑:
1. 清理冗余参数
WebAuthn Level 2 中,residentKey字段已替代requireResidentKey,同时设置两者会导致行为不一致。保留residentKey: 'required'即可,删除requireResidentKey: true。
调整后的authenticatorSelection部分:
authenticatorSelection: { authenticatorAttachment: 'cross-platform', residentKey: 'required', userVerification: 'discouraged' }
2. 理解Chrome对跨平台密钥的限制
Chrome针对跨平台硬件密钥(如YubiKey)的Resident Key创建有特殊处理:即使设置userVerification: 'discouraged',部分硬件厂商会强制要求设置PIN来保护可发现凭证(因为Resident Key存储在设备本地,属于敏感数据),这种情况下浏览器无法绕过硬件本身的策略。
如果要实现完全无需PIN的流程,可考虑:
- 允许使用平台密钥(将
authenticatorAttachment设为'platform',比如Windows Hello、Touch ID),这类密钥在创建Resident Key时,多数场景下不需要强制PIN(取决于系统设置)。 - 选择支持无PIN的Resident Key的硬件密钥,但这类设备较少,且安全风险更高。
3. 登录阶段的无用户名处理
注册完成后,登录时使用navigator.credentials.get并设置allowCredentials: [],浏览器会自动弹出设备上存储的可发现凭证列表,用户选择后即可完成无用户名登录。示例代码:
navigator.credentials.get({ publicKey: { challenge: ..., timeout: ..., rpId: 'your-domain.com', allowCredentials: [], // 空数组触发可发现凭证选择 userVerification: 'discouraged' } })
关键说明
userVerification: 'discouraged'的作用是告知浏览器尽量避免触发用户验证,但如果硬件设备或浏览器本身的安全策略强制要求,该设置不会生效。Chrome目前对跨平台Resident Key的创建默认要求设置PIN,这是为了符合WebAuthn安全规范,无法完全绕过。
内容的提问来源于stack exchange,提问作者sudoremo
相关产品推荐
相关产品推荐

