github.com/go-webauthn/webauthn(duo-labs/webauthn 仍在维护的分支)实现了两个流程——BeginRegistration/FinishRegistration 和 BeginLogin/FinishLogin,或面向 net/http 以外框架的 Validate* 变体——并能验证所有证明格式。在检查中,它校验了与 SimpleWebAuthn、py_webauthn 和 WebAuthn4J 所用相同的软件认证器响应。
策略来自配置,并通过 SessionData 传递。AuthenticatorSelection 为空时,BeginRegistration 发送的是空对象,于是浏览器采用默认值——用户验证为 preferred,驻留密钥为 discouraged——而校验时接受了未设置 UV 标志的响应,因为会话只要求 preferred。会话中设置 UserVerification: required 后,同一个断言报错 User verification required but flag not set by authenticator。应像示例那样在 Config.AuthenticatorSelection 中设置策略,并在两次调用之间保存完整的 SessionData。
计数器的处理是它与其他库最重要的区别。计数器(3)低于已存储值(5)的断言照样登录成功:返回的凭证设置了 Authenticator.CloneWarning,SignCount 仍保持为 5。该库只报告可能存在克隆;是否拒绝登录由你的代码决定,而代码必须在每次登录后检查 CloneWarning。
断言签名必须是 ASN.1 DER——64 字节的原始 r‖s 签名报错 Error validating the assertion signature: Signature invalid or not provided——而 high-S 的 DER 签名验证通过。默认的 pubKeyCredParams 列表很长:ES256、ES384 和 ES512(-7、-35、-36),RS256 到 RS512(-257 到 -259),PS256 到 PS512(-37 到 -39),以及 Ed25519(-8);Ed25519 凭证完成了端到端验证。0.18.2 中没有 ML-DSA 条目。
用 WebAuthn 查看器解码浏览器发送的数据,用 AAGUID 查询查找认证器型号,并在通行密钥沙盒中试用各个流程。