Manter as credenciais consistentes com os provedores de credenciais

Quando um usuário cria uma chave de acesso, o servidor da parte confiável salva alguns detalhes, enquanto o provedor de credenciais, como o Gerenciador de senhas do Google, salva outros. Especificamente:

  • O servidor da parte confiável salva a credencial de chave pública.
  • O provedor de credenciais salva o nome de usuário, o nome de exibição, a chave privada e outros metadados associados. Esses metadados ajudam os usuários a identificar e selecionar a chave de acesso necessária durante o login.

Possíveis inconsistências entre os dados salvos no servidor da parte confiável e o provedor de credenciais podem levar a experiências ruins para o usuário. Problemas podem surgir nos seguintes cenários:

  • Uma credencial é excluída no servidor da parte confiante, mas não no provedor de credenciais, o que faz com que o provedor mostre a credencial excluída ao usuário.
  • Um nome de usuário ou nome de exibição é atualizado no servidor da parte confiável, mas não no provedor de credenciais, o que faz com que ele mostre os detalhes desatualizados.

A API Signal do Credential Manager permite que as partes confiáveis se comuniquem com os provedores de credenciais para excluir credenciais e atualizar metadados do usuário, como nome de usuário e nome de exibição. Há três tipos de solicitações compatíveis para diferentes cenários:

  • SignalUnknownCredentialRequest

    • Indica que uma credencial específica não é mais válida e precisa ser oculta ou removida do provedor de credenciais.
  • SignalAllAcceptedCredentialIdsRequest

    • Fornece uma lista de IDs de credenciais aceitos ao provedor de credenciais.
  • SignalCurrentUserDetailsRequest

    • Atualiza os detalhes dos metadados do usuário.

Compatibilidade de versões

A API Signal está disponível em dispositivos com o Android 15 ou versões mais recentes e a partir da versão 1.6.0-beta03 da biblioteca androidx.credentials.

Implementação

Para usar a API Signal, siga estas etapas:

  1. Adicione a dependência do Credential Manager ao seu projeto.

    Kotlin

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

    Groovy

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

  2. Chamar a API Signal

    Para enviar uma solicitação de sinal ao provedor de credenciais, use uma solicitação de sinal compatível. Cada um dos tipos de solicitação de indicadores exige uma solicitação JSON, conforme mostrado nos exemplos a seguir:

    • Credencial desconhecida (SignalUnknownCredentialRequest)

      Use SignalUnknownCredentialRequest para indicar que uma credencial foi rejeitada e é considerada desconhecida. Quando o provedor de credenciais recebe esse sinal, ele oculta ou exclui a credencial.

      Uso

      Use esse indicador quando a parte confiável não conseguir verificar uma declaração de chave de acesso. Isso significa que a chave de acesso é inválida e precisa ser ocultada ou removida pelo provedor de credenciais.

      Os parâmetros JSON obrigatórios para essa solicitação são rpId e credentialId. Para mais informações sobre a estrutura JSON, consulte opções de 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()
          )
      )
      
    • Todas as credenciais aceitas (SignalAllAcceptedCredentialIdsRequest)

      Use SignalAllAcceptedCredentialIdsRequest para notificar os provedores de credenciais com o conjunto de todas as credenciais aceitas. Depois que o provedor de credenciais recebe o sinal, ele oculta ou exclui todas as credenciais que não estão incluídas nessa lista ou mostra as credenciais ocultas anteriormente que agora estão incluídas na lista.

      Uso

      Use esse indicador quando uma verificação de chave de acesso falhar pela parte confiável. Essa falha significa que a chave de acesso é inválida e precisa ser ocultada ou removida pelo provedor de credenciais. Você também pode usar esse indicador sempre que precisar transmitir o conjunto de IDs de credenciais conhecidos para provedores de credenciais.

      Os parâmetros JSON obrigatórios para essa solicitação são rpId, userId e allAcceptedCredentialIds. Para mais informações sobre a estrutura JSON, consulte opções de 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()
          )
      )
      
    • Detalhes do usuário atual (SignalCurrentUserDetailsRequest)

      Use SignalCurrentUserDetailsRequest para notificar os provedores de credenciais que os metadados, como o nome de usuário e o nome de exibição de um determinado usuário, foram atualizados e devem aparecer no provedor de credenciais.

      Uso

      Use esse indicador quando o usuário ou a parte confiável atualiza os metadados da chave de acesso associados à conta de usuário.

      Os parâmetros JSON obrigatórios para essa solicitação são rpId, userId, name e displayName. Para mais informações sobre a estrutura JSON, consulte opções de 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()
          )
      )
      

Testar a implementação

Para testar a implementação da API Signal, siga estas etapas:

  1. Instale a amostra do provedor de credenciais chamada MyVault.

  2. Ative o MyVault como um provedor de credenciais em Configurações > Senhas, chaves de acesso e contas > Serviço preferido.

    O menu &quot;Serviço preferido&quot; nas configurações do Android, mostrando o MyVault ativado como um provedor de credenciais.

  3. Ative todas as notificações do MyVault em Configurações > Apps > MyVault > Notificações.

    O menu &quot;Notificações&quot; do app MyVault, mostrando todas as notificações ativadas.

  4. Verifique se a opção Aparecer na tela está ativada para notificações em Configurações > Apps > MyVault > Notificações > Categorias > Canal de notificação da API Signal.

    Configurações do canal de notificação da API Signal para o MyVault, mostrando a opção &quot;Aparecer na tela&quot; ativada.

  5. No app, acione os fluxos que enviam as solicitações de sinal ao provedor de credenciais. As notificações do MyVault vão aparecer na tela. Isso verifica se o provedor de credenciais recebeu as solicitações.