Webauthn支持为false但Passkeys相关API可用的矛盾问题咨询
核心结论
你的理解存在偏差,且检测WebAuthn支持的方法有误,才导致了这种看似矛盾的日志结果。
具体原因拆解
你用错了WebAuthn的检测逻辑
你通过window.PublicKeyCredential?.isUserVerifyingPlatformAuthenticatorAvailable()返回值判断WebAuthn支持,这是错误的。这个API的作用不是检测浏览器是否支持WebAuthn,而是检查设备上是否存在带用户验证功能的平台认证器(比如Touch ID、Windows Hello这类内置认证工具)。如果设备没有这类硬件,或者用户未启用相关功能,它就会返回false,但这和浏览器本身是否支持WebAuthn完全无关。正确的WebAuthn基础支持检测方式
判断浏览器是否支持WebAuthn,应该先检查:typeof window.PublicKeyCredential !== 'undefined'只要这个条件成立,就说明浏览器具备WebAuthn的基础支持能力。
Conditional UI与Passkeys的关系
isConditionalMediationAvailable()是WebAuthn的Conditional UI扩展API,它的存在和返回true仅代表浏览器本身支持Passkeys所需的Conditional UI特性。你看到的Chrome 109、Edge 109版本本身是支持WebAuthn和Conditional UI的,但这些设备可能没有可用的用户验证平台认证器(比如旧Mac 10.13.6设备无Touch ID,Windows设备未设置Windows Hello),所以才出现了你的错误检测结果为false,但Conditional UI支持为true的情况。针对日志中User-Agent的补充说明
- Mac OS X 10.13.6是较旧的系统,部分该系统的设备可能没有Touch ID硬件,或者系统对平台认证器的支持有限;
- Windows 10设备如果未配置Windows Hello,也会导致
isUserVerifyingPlatformAuthenticatorAvailable()返回false,但浏览器的WebAuthn和Conditional UI功能本身是正常的。
总结
你混淆了「浏览器支持WebAuthn」和「设备有可用的平台认证器」这两个概念:WebAuthn是浏览器的能力,认证器是设备层面的硬件/配置,两者并不绑定。Passkeys的支持确实依赖WebAuthn,但只要浏览器支持WebAuthn和Conditional UI,即使设备当前没有可用的平台认证器,也属于Passkeys的支持范畴(用户可以后续添加跨平台认证器,比如YubiKey)。
内容的提问来源于stack exchange,提问作者Manoj Amalraj

