当用户创建通行密钥时,信赖方服务器会保存某些详细信息,而凭据提供方(例如 Google 密码管理工具)会保存其他信息。具体而言:
- 信赖方服务器保存公钥凭据。
- 凭据提供程序会保存用户名、显示名称、私钥和其他关联的元数据。此元数据有助于用户在登录时识别并选择所需的通行密钥。
信赖方服务器上保存的数据与凭据提供方之间可能存在不一致,这会导致糟糕的用户体验。在以下情况下可能会出现问题:
- 凭据在信赖方服务器上被删除,但在凭据提供方上未被删除,导致凭据提供方向用户显示已删除的凭据。
- 身份验证方服务器上的用户名或显示名称已更新,但凭据提供方上的用户名或显示名称未更新,导致凭据提供方显示过时的详细信息。
借助 Credential Manager 的 Signal API,信赖方可以与凭据提供方通信,以删除凭据和更新用户元数据,例如用户名和显示名称。支持以下三种请求类型,以应对不同的场景:
SignalUnknownCredentialRequest- 表示特定凭据不再有效,应从凭据提供程序中隐藏或移除。
SignalAllAcceptedCredentialIdsRequest- 向凭据提供程序提供接受的凭据 ID 列表。
SignalCurrentUserDetailsRequest- 更新用户的元数据详细信息。
版本兼容性
信号 API 适用于搭载 Android 15 或更高版本的设备,并且从 androidx.credentials 库的版本 1.6.0-beta03 开始提供。
实现
如需使用 Signal API,请按以下步骤操作:
向您的项目添加 Credential Manager 依赖项。
Kotlin
dependencies { implementation("androidx.credentials:credentials:1.6.0-rc01") }
Groovy
dependencies { implementation "androidx.credentials:credentials:1.6.0-rc01" }
调用 Signal API
如需向凭据提供程序发送信号请求,请使用受支持的信号请求。每种信号请求类型都需要 JSON 请求,如以下示例所示:
未知凭据 (
SignalUnknownCredentialRequest)使用
SignalUnknownCredentialRequest来表示凭据被拒绝并被视为未知。当凭据提供程序收到此信号时,它会隐藏或删除凭据。用法
当信赖方无法验证通行密钥断言时,使用此信号。这意味着通行密钥无效,必须由凭据提供方隐藏或移除。
此请求所需的 JSON 参数为
rpId和credentialId。如需详细了解 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 参数为
rpId、userId和allAcceptedCredentialIds。如需详细了解 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 参数为
rpId、userId、name和displayName。如需详细了解 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 的实现情况,请完成以下步骤:
安装名为 MyVault 的凭据提供程序示例。
在设置 > 密码、通行密钥和账号 > 首选服务中启用 MyVault 作为凭据提供程序。
在设置 > 应用 > MyVault > 通知中,为 MyVault 启用所有通知。
在设置 > 应用 > MyVault > 通知 > 类别 > Signal API 通知渠道中,验证通知的在屏幕上弹出是否处于开启状态。
在应用中,触发向凭据提供程序发送信号请求的流程。您应该会在屏幕上看到来自 MyVault 的通知。 这会验证凭据提供程序是否收到了请求。