javascript中模拟指纹识别比对失败并重试,本质是mock webauthn的navigator.credentials.get()行为,需用domexception精准模拟notallowederror等错误类型,并通过状态机控制“失败-重试-成功”序列。

在 JavaScript 中模拟指纹识别比对失败并支持重试,关键不是“Mock 指纹识别”本身(因为浏览器不提供可直接调用的原生指纹 API),而是 Mock Web Authentication API(WebAuthn) 的调用行为,尤其是 navigator.credentials.get() 在生物认证(如 Windows Hello、Touch ID、Face ID)场景下的失败与重试逻辑。
明确前提:浏览器里没有“指纹识别 API”,只有 WebAuthn
现代浏览器不暴露底层指纹传感器接口。实际项目中使用的生物认证能力,是通过 CredentialsContainer.get() 调用 WebAuthn 获取公钥凭证实现的。所谓“指纹比对”,本质是平台认证器(如系统弹窗)内部完成的,JS 只能观察其成功或失败结果。
因此,Mock 的目标是:让测试中 navigator.credentials.get() 有时 resolve 成功,有时 reject 失败,并支持按需重试 —— 这正是你遇到的“比对失败重试错”的核心。
Mock 失败 + 重试的常见错误写法
很多同学会这样写:
// ❌ 错误:直接抛异常但没控制 reject 原因,或重试逻辑耦合太死
jest.mock('navigator.credentials', () => ({
get: jest.fn(() => Promise.reject(new Error('UnknownError')))
}));
问题在于:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- WebAuthn 失败时 reject 的是
DOMException,不是普通Error;类型不符会导致业务代码的catch分支判断失效(比如检查err.name === 'NotAllowedError') - 没区分“用户取消”“硬件不可用”“超时”等语义,而重试策略往往依赖具体错误类型
- 静态 mock 无法支持“第一次失败、第二次成功”这种序列化行为
正确 Mock 方式:可控状态机 + 真实 DOMException
推荐用 Jest 的 mock 实现一个带状态的 get 方法:
- 用数组定义返回序列:
['fail', 'fail', 'success'] - 每次调用 pop 一个状态,匹配后返回对应 Promise
- 失败时用
new DOMException(msg, name)构造标准异常(如'NotAllowedError'、'AbortError')
示例代码:
// setupTests.js 或 test 文件中
const mockGet = jest.fn();
let authStateQueue = ['fail', 'fail', 'success'];
mockGet.mockImplementation(() => {
const state = authStateQueue.shift();
if (state === 'success') {
return Promise.resolve({ id: 'cred123', type: 'public-key', response: { authenticatorData: new Uint8Array([1,2,3]) } });
} else {
// 模拟用户点击“取消”——这是最常见重试场景
return Promise.reject(new DOMException('User cancelled the authentication', 'NotAllowedError'));
}
});
Object.defineProperty(navigator, 'credentials', {
value: { get: mockGet },
writable: true
});
这样你的业务重试逻辑(比如带防抖、次数限制、错误码过滤的封装函数)就能真实触发和验证。
业务层重试逻辑建议(配合 Mock 使用)
不要裸调 navigator.credentials.get()。封装一层带策略的函数:
- 只对
NotAllowedError和AbortError重试(用户操作类错误) - 跳过
SecurityError、InvalidStateError等不可恢复错误 - 加最大重试次数(如 3 次)和延迟(如 300ms)避免密集弹窗
- 暴露 cancel 方法,支持 UI 主动中止重试链
这样 Mock 时只需按需注入对应错误,就能端到端验证整个流程是否健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










