Android WebView登录报公钥凭据不支持DOMException如何解决
问题根因
抛出Uncaught (in promise) DOMException: The user agent does not support public key credentials的直接原因是页面调用了Web Authentication(WebAuthn,即公钥凭证)相关API,但当前WebView运行环境没有实现/开启对应API支持,且页面对这个异步接口的异常没有做捕获降级,直接抛出了未捕获的Promise异常。
常见触发场景:
- 门户网站登录流程集成了通行密钥(Passkey)能力,未做环境兼容性判断就直接调用
navigator.credentials.get()/navigator.credentials.create()等公钥凭证接口 - Android WebView默认未开启公钥凭证相关权限,部分低版本系统WebView、定制ROM阉割版WebView本身就没有实现WebAuthn能力
- 部分站点将WebAuthn校验作为登录前置流程,没有为不支持该能力的客户端预留传统密码登录的降级路径
处理方案
Android App端适配(可修改内嵌WebView代码时使用)
- 升级WebView相关依赖:确保使用AndroidX WebView 1.8.0及以上版本,设备上的系统WebView(Chrome内核)版本不低于108,低版本内核无完整WebAuthn支持。
- 给WebView放行公钥凭证权限,配置参考代码:
// 基础JS配置必须开启 webView.settings.javaScriptEnabled = true webView.webChromeClient = object : WebChromeClient() { override fun onPermissionRequest(request: PermissionRequest?) { request?.let { // 识别到公钥凭证权限请求时直接放行 if (PermissionRequest.RESOURCE_PUBLIC_KEY_CREDENTIALS in it.resources) { it.grant(arrayOf(PermissionRequest.RESOURCE_PUBLIC_KEY_CREDENTIALS)) return } super.onPermissionRequest(it) } } }
- 若遇到定制ROM阉割系统WebView WebAuthn能力的情况,可在App内集成独立的Trichrome WebView运行时,绕开系统WebView的功能限制。
- 临时调试场景可修改WebView的User-Agent,移除UA中默认携带的
; wv标识,部分站点会根据该标识识别WebView环境,修改后可绕过部分强制WebAuthn校验的逻辑。
门户网站前端适配(可修改站点登录页代码时使用)
注意:不要把WebAuthn作为登录流程的唯一分支,必须预留密码、短信验证码等降级登录路径,否则所有低版本WebView、旧版浏览器用户都会遇到登录失败问题
- 调用WebAuthn接口前必须做特性检测,不支持环境直接降级到传统密码登录流程,同时捕获接口调用异常避免未捕获Promise抛出:
// 提前检测WebAuthn能力支持情况 const supportWebAuthn = !!(window.PublicKeyCredential && typeof window.PublicKeyCredential === 'function') const loginSubmit = async () => { try { if (supportWebAuthn) { // 执行通行密钥登录逻辑 } else { // 直接走账号密码提交流程 } } catch (err) { // 捕获WebAuthn调用异常,自动降级到密码登录 console.warn('WebAuthn unavailable, fallback to password login', err) // 执行密码表单提交逻辑 } }
- 增加WebView环境识别逻辑,检测到Android WebView环境时,默认跳过WebAuthn预加载、前置校验相关逻辑,直接渲染密码登录表单。
内容的提问来源于stack exchange,提问作者Anubhav
相关产品推荐
相关产品推荐

