依赖方 (RP) 可以通过检查关联公钥凭据的 AAGUID,确定通行密钥由哪个通行密钥提供方创建。
通行密钥管理方面的挑战
使用通行密钥的一个好处是,用户可以为单个账号创建多个通行密钥。借助这种灵活性以及通行密钥的强大性,即使用户因丢失通行密钥之一而被锁定账号,也仍然可以使用备用通行密钥登录依赖方。
在 RP 上管理多个通行密钥的用户面临的挑战是,当需要修改或删除其中的特定通行密钥时,如何识别正确的通行密钥。一个很好的示例是,用户想要移除未使用的通行密钥。建议 RP 在通行密钥列表中附加有关通行密钥的信息,例如创建日期和上次使用日期。这有助于用户找到特定的通行密钥。
RP 还可以允许用户在创建通行密钥时或之后为其命名,但许多用户都不会这样做。理想情况下,通行密钥的命名应自动反映从客户端发送的信号或公钥凭据中包含的信息。
浏览器会提供一个用户代理字符串,以供各方用来为通行密钥命名,但具有扩展功能的平台(例如 Android、iOS 或桌面浏览器)允许通过第三方密码管理器创建通行密钥,并且用户代理字符串未必能代表真正的通行密钥提供程序。
借助通行密钥注册时返回的公钥凭据中包含的身份验证器证明全局唯一标识符 (AAGUID),RP 可以确定通行密钥提供程序,并使用该提供程序来帮助用户轻松找到正确的通行密钥。
使用 AAGUID 确定通行密钥提供程序
AAGUID 是一个唯一数字,用于标识身份验证器的型号(而非身份验证器的具体实例)。AAGUID 可在公钥凭据的身份验证器数据中找到。
RP 可以使用 AAGUID 来标识通行密钥提供程序。例如,如果用户使用 Google 密码管理工具在 Android 设备上创建通行密钥,RP 将收到 "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4"
的 AAGUID。RP 可以在通行密钥列表中为通行密钥添加注释,以指明其是在 Google 密码管理工具中创建的。
如需将 AAGUID 映射到通行密钥提供程序,RP 可以使用 AAGUID 的社区来源代码库。通过在列表中查找 AAGUID,您可以找到通行密钥提供程序名称及其图标 svg 数据文本。
检索 AAGUID 是大多数 WebAuthn 库提供的一项功能。以下示例展示了使用 SimpleWebAuthn 的服务器端注册代码:
// Import a list of AAGUIDs from a JSON file
import aaguids from './aaguids.json' with { type: 'json' };
...
// Use SimpleWebAuthn handy function to verify the registration request.
const { verified, registrationInfo } = await verifyRegistrationResponse({
response: credential,
expectedChallenge,
expectedOrigin,
expectedRPID,
requireUserVerification: false,
});
...
const { aaguid } = registrationInfo;
const provider_name = aaguids[aaguid]?.name || 'Unknown';
总结
AAGUID 是一个唯一字符串,用于标识创建通行密钥的通行密钥提供程序。RP 可以使用 AAGUID 来帮助用户更轻松地管理通行密钥。社区提供的 AAGUID 代码库可用于将 AAGUID 映射到通行密钥提供程序。