PublicKeyCredential: signalAllAcceptedCredentials() 静态方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

PublicKeyCredential 接口的 signalAllAcceptedCredentials() 静态方法会向认证器发出信号,告知它依赖方(RP)服务器仍然为特定用户持有的所有有效的凭据 ID

这允许认证器更新凭据信息,删除 RP 不再识别的所有凭据,例如已删除帐户的凭据。每次用户使用 RP 进行身份验证时都应调用此方法。

signalAllAcceptedCredentials() 只能在当前用户已通过身份验证时调用——在注册或登录之后,或在用户删除凭据时调用,因为它会暴露属于用户的敏感信息。

语法

js
signalAllAcceptedCredentials(options)

参数

options

一个代表有效凭据的对象,其中包含以下属性

allAcceptedCredentialIds

一个 base64url 编码字符串数组,表示仍然有效的凭据 ID

rpId

一个字符串,表示发送信号的 RP 的 ID

userId

一个 base64url 编码字符串,表示凭据所属用户的 ID

返回值

一个 Promise,解析为 undefined

异常

Promise 会因以下异常而拒绝

SecurityError DOMException

RP 域无效。

TypeError DOMException

userIdallAcceptedCredentialIds 中的任何元素不是有效的 base64url 编码字符串。

描述

用户认证器中存储的关于可发现凭据(例如,passkey)的信息可能会与服务器不同步。当用户在 RP Web 应用中删除凭据而未更新认证器时,通常会发生这种情况。

当用户尝试使用可发现凭据登录时,他们会看到认证器提供的一组凭据供选择,然后所选凭据会返回给 RP Web 应用以进行登录。如果用户选择了一个已从 RP 服务器删除的凭据,该凭据将不会被识别,登录将失败。这会给用户带来困惑,因为他们期望只会看到应该成功的凭据。

为了缓解此问题,RP Web 应用应在用户删除凭据或每次用户登录时调用 signalAllAcceptedCredentials(),以告知认证器哪些凭据对给定用户仍然有效。认证器如何处理此信息由其自行决定,但预期它会同步其信息与提供的凭据列表。未出现在列表中的凭据应被删除,以便用户不会看到登录 UI 中不存在的凭据。

警告:调用 signalAllAcceptedCredentials() 时要谨慎——列表中未包含的任何有效凭据都将从认证器中删除,这将阻止用户使用它们进行登录。传递空列表可能会删除用户的所有凭据。某些认证器可能支持通过后续调用 signalAllAcceptedCredentials() 来恢复凭据,并将先前删除的凭据 ID 包含在列表中。

signalAllAcceptedCredentials() 只能在当前用户已通过身份验证时调用,因为它会暴露属于用户的敏感信息。如果用户因尝试使用 RP 服务器上不存在的凭据登录而未通过身份验证,则应改用 unrecognized 凭据调用 PublicKeyCredential.signalUnknownCredential(),以便认证器可以删除它。有关更详细的比较,请参阅 可发现凭据同步方法

示例

信令已接受的凭据

在此示例中,我们调用 signalAllAcceptedCredentials() 方法,并将用户拥有的所有凭据(包括他们刚刚登录的凭据)的详细信息传递给它。因此,认证器应该更新其自身的凭据副本,以便与 RP 保持同步。

js
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url-encoded user ID
    allAcceptedCredentialIds: [
      // A list of base64url-encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      // …
    ],
  });
}

有关更多代码示例,请参阅 developer.chrome.com 上的 使用 Signal API 使 passkey 与服务器上的凭据保持一致 (2024)。

规范

规范
Web Authentication:访问公钥凭证的 API - 第 3 级
# dom-publickeycredential-signalallacceptedcredentials

浏览器兼容性

另见