由 pnpm docs:lessons 生成;内容源 src/data/advanced.json,合同源 scripts/generate-advanced.mjs。含教师参考答案。前置:20、35、49。
理解虚拟认证器、注册与认证。区分 RP、origin、一次性 challenge、凭据 ID 和 UV;虚拟认证器用于测试,不是生产登录方案。
create() 生成凭据,get() 签署新挑战;服务端验证 clientData、rpIdHash 与签名。
allowCredentials 决定候选凭据;UP 与 UV 是不同标志。
本地协议夹具理解失败条件;真实 WebAuthn 从独立 localhost:4174 页面调用虚拟认证器。IP 地址即使属于安全上下文,也不能充当有效 RP 域名。两条路径分别取证。
对应挑战、凭据和验证过程。改变本课输入条件并预测结果;对照请求、状态或约束的关系;切换最小修复并复位,核对改变的范围。综合题先提交判断再解锁因果模型,所有模型不计完成。
认证找不到已注册凭据,或要求用户验证但认证器未满足。
- 先完成本地协议夹具,理解两种条件失败;它不调用真实认证器。
- 从原页打开独立 localhost 原生取证页并先运行故障;127.0.0.1 不可作为 RP 域名,原页课堂夹具与教程回传继续保留。
- WebAuthn 面板启用 virtual authenticator environment,添加 CTAP2 / internal,支持 resident key 与 User Verification。
- 点击本页真实注册,检查面板 Credential ID 与服务接收的公钥;仅使用测试虚拟凭据。
- 点击真实认证;故障 A 更换候选 ID,故障 B 要求 UV,可在面板切换 Is user verified 重现。
- 应用对应对照;使用新 challenge,验证服务实际签名、origin、RP、UP / UV。
- 删除本课虚拟凭据和认证器并关闭虚拟环境;会话重启失效,不作为生产身份系统。
排查凭据或用户验证条件问题。新输入与两种故障随机;可能再次抽到同种,不保证轮流。
| 配置 | 根因 | 实际证据 | 针对性验证 |
|---|---|---|---|
| 配置1 | 认证 allowCredentials 不包含刚注册的凭据 ID | 注册 ID 与候选 ID 不一致,get() 无匹配凭据 | 保持同一 RP 和凭据 ID,使用新挑战完成认证 |
| 配置2 | 认证要求 UV,但认证器未报告用户验证 | authenticatorData 的 UV 位未置位,required 条件不成立 | 配置支持并通过 User Verification 的虚拟认证器,保持 required |
| 干扰项 | 只根据表面现象修改无关条件 | 没有保留条件与输入的一次截图 | 同时改变设备、数据与逻辑,只保留成功结果 |
- 先复现 认证找不到已注册凭据,或要求用户验证但认证器未满足。
- 对照实际证据:注册 ID 与候选 ID 不一致,get() 无匹配凭据;或 authenticatorData 的 UV 位未置位,required 条件不成立
- 一次只改变对应原因:保持同一 RP 和凭据 ID,使用新挑战完成认证;或 配置支持并通过 User Verification 的虚拟认证器,保持 required
课堂协议夹具不等于真实 create/get;真实结果独立显示。支持 ES256、none attestation,非生产认证服务。 保持输入、数量、环境一致;完成故障与正常对照,选择一致证据;三轮引导和两配置挑战分别取证,原生步骤与本地结果分列。停止后清理本会话资源,再恢复浏览器设置。