PublicKeyCredentialUserEntity 中 id 的用途

Purpose of id in PublicKeyCredentialUserEntity

当您调用 navigator.credentials.create 生成新凭证时,您需要在 PublicKeyCredentialCreationOptions 中包含一个带有 id 的 [PublicKeyCredentialUserEntity][1]。规范说这个 id 必须用于身份验证和授权决策,但是当你调用 navigator.credentials.get 时你不会在 PublicKeyCredentialRequestOptions 中传递这个值。您只需要您将允许签署挑战的凭据的凭据 ID。

如果我在后端已经有一个唯一的客户标识符来关联每个生成的凭据并可以使用它来获取正确的凭据 ID,那么我对 PublicKeyCredentialUserEntity 的 userId 使用什么值真的很重要吗?

If I already have a unique customer identifier on the backend to associate each generated credential with and can use this to fetch the correct credential ID, does it really matter what value I use for the userId of the PublicKeyCredentialUserEntity?

对于 2FA 和无密码,您可能不需要太担心。正如您所说,您已经在数据库中通过凭据 ID 建立了与用户记录的关系,并且用户必须通过 username/email/etc... 确定自己的身份才能完成 2FA 或无密码身份验证。

user.id, also known as the userHandle, becomes most important when you require discoverable credentials 注册期间。这些类型的凭据内部存储在密钥为 (rpID, userHandle) 的映射中的身份验证器中。您必须小心这些,因为如果您允许用户再次注册相同的身份验证器并为 user.id 指定相同的值,身份验证器将 覆盖 现有的可发现凭证。 =21=]

另一方面,可发现的凭据允许“无用户名”身份验证。 userHandle you get back from navigator.credentials.get() 的值将是您作为 RP 知道用户 ID 的方式,而不是他们事先通过 username/email/etc 告诉您...因为它与 user.id 的值相同你进入了 navigator.credentials.create().