使用 AAGUID 确定通行密钥提供商

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

通行密钥管理面临的挑战

使用通行密钥的好处之一是,它们允许用户为一个帐户创建多个通行密钥。凭借这种灵活性以及通行密钥的稳健性,即使某用户因丢失其中一个通行密钥而被帐户锁定,他们仍然可以使用其他通行密钥登录依赖方。

对于在 RP 上管理多个通行密钥的用户来说,挑战在于当他们需要在众多通行密钥中编辑或删除特定通行密钥时,如何识别正确的通行密钥。一个很好的例子是用户想要删除未使用的通行密钥。建议 RP 在通行密钥列表中附加有关通行密钥的信息,例如创建日期和上次使用日期。这有助于用户找到特定的通行密钥。

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

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

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

使用 AAGUID 确定通行密钥提供商

AAGUID 是一个唯一编号,用于标识身份验证器的型号(而不是身份验证器的特定实例)。AAGUID 可以在公钥凭据的身份验证器数据中找到。

Attestation object layout illustrating the included authenticator data (containing attested credential data) and the attestation statement.
AAGUID 可以在身份验证器数据中找到。

RP 可以使用 AAGUID 来识别通行密钥提供商。例如,如果用户在 Android 设备上使用 Google 密码管理器创建通行密钥,则 RP 将收到 AAGUID "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4"。RP 可以在通行密钥列表中注释通行密钥,以表明它是使用 Google 密码管理器创建的。

Passkey settings within security settings page show detailed information about each passkey.
通行密钥管理 UI 示例。

为了将 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 映射到通行密钥提供商。