依赖方 (RP) 可以通过检查关联公钥凭据的 AAGUID,确定由哪个通行密钥提供商创建通行密钥。
通行密钥管理面临的挑战
使用通行密钥的好处之一是,用户可以使用通行密钥为一个帐号创建多个通行密钥。有了这种灵活性和通行密钥的稳健性,即使用户因失去其中一个通行密钥而无法访问帐号,他们仍然可以使用其他通行密钥登录依赖方。
对于在 RP 上管理多个通行密钥的用户,他们面临的挑战是在需要修改或删除其中的某个通行密钥时,确定正确的通行密钥。一个很好的例子就是用户想要移除未使用的通行密钥。建议 RP 在通行密钥列表中附加通行密钥的相关信息,例如创建日期和上次使用日期。这有助于用户找到特定的通行密钥。
RP 还可以允许用户在通行密钥创建后或之后为其命名,但许多用户并没有这样做。理想情况下,通行密钥的名称会自动反映从客户端发送的信号或公钥凭据中包含的信息。
浏览器会提供一个用户代理字符串,依赖方可以使用该字符串来命名通行密钥,但 Android、iOS 或具有扩展功能的桌面浏览器等平台允许通过第三方密码管理工具创建通行密钥,而用户代理字符串并不一定代表实际的通行密钥提供商。
使用通行密钥注册时返回的公钥凭据内包含的身份验证器认证全局唯一标识符 (AAGUID),RP 可以确定通行密钥提供程序,并使用该提供程序轻松找到正确的通行密钥。
使用 AAGUID 确定通行密钥提供程序
AAGUID 是一个具有唯一性的编号,用于标识身份验证器的型号(而不是身份验证器的具体实例)。AAGUID 可在公钥凭据的身份验证器数据中找到。
![证明对象布局,显示包含的身份验证器数据(包含经过认证的凭据数据)和证明声明。](https://web.developers.google.cn/static/articles/webauthn-aaguid/image/attestation_object.jpg?authuser=9&hl=hr)
RP 可以使用 AAGUID 来识别通行密钥提供程序。例如,如果用户使用 Google 密码管理工具在 Android 设备上创建了通行密钥,RP 收到的 AAGUID 为 "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4"
。RP 可以为通行密钥列表中的通行密钥添加注解,以指明该通行密钥是在 Google 密码管理工具中创建的。
![安全设置页面中的通行密钥设置会显示每个通行密钥的详细信息。](https://web.developers.google.cn/static/articles/webauthn-aaguid/image/passkey_management.jpg?authuser=9&hl=hr)
如需将 AAGUID 映射到通行密钥提供程序,RP 可以使用社区来源的 AAGUID 代码库。在该列表中查找 AAGUID,即可找到通行密钥提供方名称及其图标 svg 数据文本。
大多数 WebAuthn 库都会提供检索 AAGUID 的功能。以下示例显示了使用 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 映射到通行密钥提供程序。