本文档介绍了 WebAuthn 中的 userVerification
是什么,以及在创建通行密钥或进行身份验证期间指定 userVerification
时会导致的浏览器行为。
WebAuthn 中的“用户验证”是什么?
通行密钥基于公钥加密技术构建而成。创建通行密钥后,系统会生成公钥私钥对,私钥由通行密钥提供程序存储,而公钥会返回到依赖方 (RP) 服务器进行存储。服务器可以使用配对的公钥验证由同一通行密钥签名的签名,从而对用户进行身份验证。公钥凭据上的“用户在场”(UP) 标志可证明在身份验证期间有人与设备互动过。
用户验证是一道可选的安全防护,旨在如“用户存在状态”所声明的那样,旨在断言身份验证期间存在的确实是正确的人员,而不仅仅是某个人。在智能手机上,通常使用屏幕锁定机制(无论是生物识别、PIN 码还是密码)来实现此目的。在通行密钥注册和身份验证期间,身份验证器数据中会返回“UV”标志,以报告是否执行了用户验证
如何在服务器上验证 UP 和 UV
系统会在身份验证器数据字段中向服务器发送用户在线 (UP) 和用户已验证 (UV) 布尔标志。在身份验证期间,可通过使用存储的公钥验证签名来验证身份验证器数据字段的内容。只要签名有效,服务器就可以将标志视为真实。
在通行密钥注册和身份验证期间,服务器应检查 UP 标志是否为 true
,以及 UV 标志是否为 true
或 false
(具体取决于要求)。
指定 userVerification
参数
根据 WebAuthn 规范,RP 可以在创建凭据和断言时使用 userVerification
参数请求用户验证。它接受 'preferred'
、'required'
或 'discouraged'
,分别表示:
'preferred'
(默认):首选在设备上使用用户验证方法,但如果无法使用,则可以跳过。如果执行了用户验证,响应凭据中的 UV 标志值为true
;如果未执行 UV,则为false
。'required'
:必须调用设备上可用的用户验证方法。如果没有可用的实例,请求将在本地失败。这意味着响应凭据始终返回,且 UV 标志设置为true
。'discouraged'
:不建议使用用户验证方法。不过,无论如何,系统都可能会执行用户验证,并且 UV 标志可以包含true
或false
。
用于创建通行密钥的示例代码:
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
userVerification: 'preferred'
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
通行密钥身份验证的示例代码:
const publicKeyCredentialRequestOptions = {
challenge: /* Omitted challenge data... */,
rpId: 'example.com',
userVerification: 'preferred'
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
您应该为“userVerification
”选择哪个选项?
您应使用的 userVerification
值取决于您的应用要求以及用户体验需求。
何时使用 userVerification='preferred'
如果您更注重用户体验而非保护,请使用 userVerification='preferred'
。
在某些环境中,用户验证会给用户带来更多不便,而不是保护用户。例如,在无法使用触控 ID(由于设备不支持触控 ID,或设备处于翻盖模式)的 macOS 上,系统会改为要求用户输入系统密码。这会造成不便,用户可能会完全放弃身份验证。如果消除摩擦对您来说更重要,请使用 userVerification='preferred'
。
对于 userVerification='preferred'
,如果成功执行用户验证,UV 标志为 true
;如果跳过用户验证,则为 false
。例如,在无法使用 Touch ID 的 macOS 上,系统会要求用户点击一个按钮以跳过用户验证,并且公钥凭据包含 false
UV 标志。
随后,紫外线标志可用作风险分析中的信号。如果登录尝试因其他因素而似乎存在风险,您可能需要在用户未执行用户验证的情况下,向用户提出额外的登录质询。
何时使用 userVerification='required'
如果您认为 UP 和 UV 都绝对必要,请使用 userVerification='required'
。
此选项的缺点是,用户在登录时可能会遇到更多阻碍。例如,在无法使用 Touch ID 的 macOS 上,系统会要求用户输入系统密码。
借助 userVerification='required'
,您可以确保在设备上执行用户验证。确保服务器验证 UV 标志是否为 true
。
总结
通过利用用户验证,使用通行密钥的信赖方可以评估设备所有者登录的可能性。开发者可以选择是要求用户进行验证,还是将其设为可选,具体取决于后备登录机制对用户体验流程的影响程度。确保服务器检查 UP 标志和 UV 标志以进行通行密钥用户身份验证。