确保凭据与凭据提供方保持一致

当用户创建通行密钥时,信赖方服务器会保存某些详细信息,而凭据提供方(例如 Google 密码管理工具)会保存其他信息。具体而言:

  • 信赖方服务器保存公钥凭据。
  • 凭据提供程序会保存用户名、显示名称、私钥和其他关联的元数据。此元数据有助于用户在登录时识别并选择所需的通行密钥。

信赖方服务器上保存的数据与凭据提供方之间可能存在不一致,这会导致糟糕的用户体验。在以下情况下可能会出现问题:

  • 凭据在信赖方服务器上被删除,但在凭据提供方上未被删除,导致凭据提供方向用户显示已删除的凭据。
  • 身份验证方服务器上的用户名或显示名称已更新,但凭据提供方上的用户名或显示名称未更新,导致凭据提供方显示过时的详细信息。

借助 Credential Manager 的 Signal API,信赖方可以与凭据提供方通信,以删除凭据和更新用户元数据,例如用户名和显示名称。支持以下三种请求类型,以应对不同的场景:

  • SignalUnknownCredentialRequest

    • 表示特定凭据不再有效,应从凭据提供程序中隐藏或移除。
  • SignalAllAcceptedCredentialIdsRequest

    • 向凭据提供程序提供接受的凭据 ID 列表。
  • SignalCurrentUserDetailsRequest

    • 更新用户的元数据详细信息。

版本兼容性

信号 API 适用于搭载 Android 15 或更高版本的设备,并且从 androidx.credentials 库的版本 1.6.0-beta03 开始提供。

实现

如需使用 Signal API,请按以下步骤操作:

  1. 向您的项目添加 Credential Manager 依赖项。

    Kotlin

    dependencies {
        implementation("androidx.credentials:credentials:1.6.0-rc01")
    }

    Groovy

    dependencies {
        implementation "androidx.credentials:credentials:1.6.0-rc01"
    }

  2. 调用 Signal API

    如需向凭据提供程序发送信号请求,请使用受支持的信号请求。每种信号请求类型都需要 JSON 请求,如以下示例所示:

    • 未知凭据 (SignalUnknownCredentialRequest)

      使用 SignalUnknownCredentialRequest 来表示凭据被拒绝并被视为未知。当凭据提供程序收到此信号时,它会隐藏或删除凭据。

      用法

      当信赖方无法验证通行密钥断言时,使用此信号。这意味着通行密钥无效,必须由凭据提供方隐藏或移除。

      此请求所需的 JSON 参数为 rpIdcredentialId。如需详细了解 JSON 结构,请参阅 signalUnknownCredential 选项

      credentialManager.signalCredentialState(
          SignalUnknownCredentialRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("credentialId", credentialId /* [String] Credential ID of the credential to be hidden or deleted */)
              }.toString()
          )
      )
      
    • 所有接受的凭据 (SignalAllAcceptedCredentialIdsRequest)

      使用 SignalAllAcceptedCredentialIdsRequest 通知凭据提供方所有已接受的凭据。凭据提供程序收到信号后,会隐藏或删除此列表中未包含的任何凭据,或取消隐藏此列表中现在包含的任何之前隐藏的凭据。

      用法

      当信赖方无法验证通行密钥时,使用此信号。 此失败表示通行密钥无效,必须由凭据提供方隐藏或移除。您还可以在需要将已知凭据 ID 集广播给凭据提供程序时使用此信号。

      此请求所需的 JSON 参数为 rpIduserIdallAcceptedCredentialIds。如需详细了解 JSON 结构,请参阅 signalAllAcceptedCredential 选项

      credentialManager.signalCredentialState(
          SignalAllAcceptedCredentialIdsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put(
                      "allAcceptedCredentialIds",
                      JSONArray(credentialIdsList /* [List<String>] List of accepted Credential IDs */)
                  )
              }.toString()
          )
      )
      
    • 当前用户详情 (SignalCurrentUserDetailsRequest)

      使用 SignalCurrentUserDetailsRequest 通知凭据提供程序,指定用户的元数据(例如用户名和显示名称)已更新,应显示在凭据提供程序中。

      用法

      当用户或信赖方更新与用户账号关联的通行密钥元数据时,请使用此信号。

      此请求所需的 JSON 参数为 rpIduserIdnamedisplayName。如需详细了解 JSON 结构,请参阅 signalCurrentUserDetails 选项

      credentialManager.signalCredentialState(
          SignalCurrentUserDetailsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put("name", name /* [String] New Name to be updated for the current user */)
                  put("displayName", displayName /* [String] New display name to be updated for the current user */)
              }.toString()
          )
      )
      

测试实现

如需测试 Signal API 的实现情况,请完成以下步骤:

  1. 安装名为 MyVault 的凭据提供程序示例。

  2. 设置 > 密码、通行密钥和账号 > 首选服务中启用 MyVault 作为凭据提供程序。

    Android 设置中的“首选服务”菜单,显示 MyVault 已启用为凭据提供程序。

  3. 设置 > 应用 > MyVault > 通知中,为 MyVault 启用所有通知。

    MyVault 应用的“通知”菜单,显示所有已启用的通知。

  4. 设置 > 应用 > MyVault > 通知 > 类别 > Signal API 通知渠道中,验证通知的在屏幕上弹出是否处于开启状态。

    MyVault 的 Signal API 通知渠道设置,显示“在屏幕上弹出”选项已启用。

  5. 在应用中,触发向凭据提供程序发送信号请求的流程。您应该会在屏幕上看到来自 MyVault 的通知。 这会验证凭据提供程序是否收到了请求。