生物识别登录时指纹图标不显示怎么办?
我在做移动端的生物识别登录功能,用的是 WebAuthn API,但用户设备支持指纹时,页面上的指纹图标死活不显示。我试过在 Safari 和 Chrome 都不行,控制台也没报错。
CSS 里是这样写的:
.biometric-icon {
background-image: url('./fingerprint.svg');
width: 24px;
height: 24px;
background-size: contain;
display: inline-block;
}
路径确认是对的,其他图片都能正常加载,就这个图标在调用 navigator.credentials.get() 后不出现,是不是和权限或者 CSP 有关系?
navigator.credentials.get()时,浏览器会弹出一个原生的认证对话框,这个对话框是浏览器自己绘制的,会直接覆盖在你的页面之上。你看到的不是你的自定义图标,而是浏览器自己的 UI。这是 WebAuthn 的安全机制,没法通过网页自定义。
如果你想让用户看到自定义的指纹图标,有几个思路:
一是用指纹识别 API(
navigator.credentials之外的),比如一些移动端框架提供的插件,可以自己控制 UI。二是改变触发方式,不要直接调用
get(),而是在页面上放一个按钮,用户点击按钮后显示你的自定义图标,然后按钮的点击事件里再调用 WebAuthn。三是用
publicKey.authenticatorSelection.authenticatorAttachment这个参数,如果设为cross-platform,在某些设备上会调用安全密钥而不是本地生物识别,对 UI 的控制会稍微多一点,不过体验可能不如原生。还有个可能:你的图标路径在 CSS 里用的是相对路径
./fingerprint.svg,如果页面是通过不同路径访问的,可能路径解析会出问题。不过你说其他图片能加载,这个应该不是问题。最直接的办法:你想要完全自定义 UI 的话,就别用 WebAuthn 的原生弹窗,自己用第三方插件实现生物识别,然后在认证成功后再调用 WebAuthn 的 create() 或 get() 完成绑定/验证。