使用 AAGUID 确定通行密钥提供程序

依赖方 (RP) 可以通过检查关联的公钥凭据的 AAGUID 来确定通行密钥是通过哪个通行密钥提供程序创建的。

通行密钥管理方面的挑战

使用通行密钥的一个好处是,用户可以为单个账号创建多个通行密钥。借助这种灵活性以及通行密钥的强大性,即使用户因丢失通行密钥之一而被锁定账号,也仍然可以使用备用通行密钥登录依赖方。

在 RP 上管理多个通行密钥的用户面临的挑战是,当需要修改或删除其中的特定通行密钥时,如何识别正确的通行密钥。一个很好的示例是,用户想要移除未使用的通行密钥。建议 RP 在通行密钥列表中附加通行密钥的相关信息,例如创建日期和上次使用日期。这有助于用户查找特定通行密钥。

RP 还可以允许用户在创建通行密钥时或之后为其命名,但许多用户都不会这样做。理想情况下,通行密钥的命名应自动反映从客户端发送的信号或公钥凭据中包含的信息。

浏览器提供用户代理字符串,以供依赖方用于为通行密钥命名,但具有扩展程序功能的 Android、iOS 或桌面浏览器等平台允许第三方密码管理工具创建通行密钥,并且用户代理字符串不一定代表实际的通行密钥提供方。

借助身份验证器认证全局唯一标识符 (AAGUID)(包含在通行密钥注册时返回的公钥凭据中),RP 可以确定通行密钥提供程序,并使用该标识符让用户轻松找到正确的通行密钥。

使用 AAGUID 确定通行密钥提供程序

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 映射到通行密钥提供程序。