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 confiável, mas não no provedor de credenciais, o que faz com que o provedor de credenciais 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 o provedor de credenciais mostre os detalhes desatualizados.

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

  • SignalUnknownCredentialRequest

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

    • Fornece uma lista de IDs de credenciais aceitos para o 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 na 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.7.0-alpha02")
    }

    Groovy

    dependencies {
        implementation "androidx.credentials:credentials:1.7.0-alpha02"
    }

  2. Chamar a API Signal

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

    • Credencial desconhecida (SignalUnknownCredentialRequest)

      Use SignalUnknownCredentialRequest para sinalizar 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 necessá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 sinal é recebido pelo provedor de credenciais, ele oculta ou exclui as credenciais que não estão incluídas nessa lista ou reexibe as credenciais ocultas 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 as 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 de que os metadados, como o nome de usuário e o nome de exibição de um determinado usuário, foram atualizados e precisam aparecer no provedor de credenciais.

      Uso

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

      Os parâmetros JSON necessários para essa solicitação são rpId, userId, name e displayName. Para mais informações sobre a estrutura JSON, consulte as 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 sua implementação da API Signal, siga estas etapas:

  1. Instale o exemplo de provedor de credenciais chamado MyVault.

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

    O menu &quot;Serviço preferencial&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 Exibir 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;Pop on screen&quot; ativada.

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