Integrar o Gerenciador de credenciais ao recurso "Fazer login com o Google"

O recurso Fazer login com o Google ajuda você a integrar rapidamente a autenticação do usuário ao seu app Android. Os usuários podem usar a Conta do Google para fazer login no app, fornecer consentimento e compartilhar as informações do perfil com segurança com o app. A biblioteca Jetpack do Gerenciador de credenciais do Android facilita essa integração, oferecendo uma experiência consistente em dispositivos Android usando uma única API.

Este documento orienta você na implementação do recurso "Fazer login com o Google" em apps Android, como configurar a interface do botão "Fazer login com o Google" e como configurar experiências de login e inscrição otimizadas para apps. Para facilitar a migração de dispositivos, o recurso "Fazer login com o Google" oferece suporte ao login automático, e a natureza multiplataforma do Android, iOS e plataformas da Web ajuda você a fornecer acesso de login para seu app em qualquer dispositivo.

Para configurar o recurso, siga estas duas etapas principais:

Configurar o recurso "Fazer login com o Google" como uma opção para a interface da página inferior do Gerenciador de credenciais. Isso pode ser configurado para solicitar automaticamente que o usuário faça login. Se você implementou chaves de acesso ou senhas, pode solicitar todos os tipos de credenciais relevantes simultaneamente, para que o usuário não precise se lembrar da opção usada anteriormente para fazer login.

Página inferior do Gerenciador de credenciais
Figura 1. Interface de seleção de credenciais da página inferior do Gerenciador de credenciais.

Adicione o botão "Fazer login com o Google" à interface do seu app. O botão "Fazer login com o Google" oferece uma maneira simplificada de usar as próprias Contas do Google para se inscrever ou fazer login em apps Android. Os usuários vão clicar no botão "Fazer login com o Google" se dispensarem a interface da página inferior ou se quiserem usar a Conta do Google explicitamente para se inscrever e fazer login. Para desenvolvedores, isso significa uma integração mais fácil de usuários e menos atrito durante a inscrição.

Animação mostrando o fluxo "Fazer login com o Google"
Figura 2. Interface do botão "Fazer login com o Google" do Gerenciador de credenciais

Este documento explica como integrar o botão "Fazer login com o Google" e a caixa de diálogo da página inferior à API Credential Manager usando a biblioteca auxiliar ID do Google.

Configurar seu projeto do Console de APIs do Google

  1. Abra seu projeto no Console de APIs ou crie um projeto se ainda não tiver um.
  2. Na página da tela de permissão OAuth, verifique se todas as informações estão completas e precisas.
    1. Verifique se o app tem um nome, logotipo e página inicial corretos atribuídos a ele. Esses valores serão apresentados aos usuários na tela de consentimento do recurso "Fazer login com o Google" na inscrição e na tela de apps e serviços de terceiros.
    2. Verifique se você especificou os URLs da Política de Privacidade e dos Termos de Serviço do app.
  3. Na página "Credenciais", crie um ID do cliente Android para seu app se você ainda não tiver um. Você vai precisar especificar o nome do pacote e a assinatura SHA-1 do app.
    1. Acesse a página Credenciais.
    2. Clique em Criar credenciais > ID do cliente OAuth.
    3. Selecione o tipo de aplicativo Android.
  4. Na página "Credenciais", crie um novo ID do cliente "aplicativo da Web", caso ainda não tenha feito isso. Ignore os campos "Origens JavaScript autorizadas" e "URIs de redirecionamento autorizados" por enquanto. Esse ID será usado para identificar seu servidor de back-end quando ele se comunicar com os serviços de autenticação do Google.
    1. Acesse a página Credenciais.
    2. Clique em Criar credenciais > ID do cliente OAuth.
    3. Selecione o tipo de aplicativo da Web.

Declarar dependências

No arquivo build.gradle do módulo, declare as dependências usando a versão mais recente do Gerenciador de credenciais:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Instanciar uma solicitação de login do Google

Para começar a implementação, instancie uma solicitação de login do Google. Use GetGoogleIdOption para extrair o token de ID do Google de um usuário.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Primeiro, verifique se o usuário tem alguma conta que foi usada anteriormente para fazer login no seu app chamando a API com o parâmetro setFilterByAuthorizedAccounts definido como true. Os usuários podem escolher entre as contas disponíveis para fazer login.

Se nenhuma Conta do Google autorizada estiver disponível, o usuário será solicitado a se inscrever com qualquer uma das contas disponíveis. Para fazer isso, solicite que o usuário chame a API novamente e defina setFilterByAuthorizedAccounts como false. Saiba mais sobre como se inscrever.

Ativar o login automático para usuários recorrentes (recomendado)

Os desenvolvedores precisam ativar o login automático para usuários que se registram com a conta única. Isso proporciona uma experiência perfeita em todos os dispositivos, especialmente durante a migração, em que os usuários podem recuperar rapidamente o acesso à conta sem precisar reinserir as credenciais. Para seus usuários, isso elimina atritos desnecessários quando eles já estavam conectados anteriormente.

Para ativar o login automático, use setAutoSelectEnabled(true). O login automático só é possível quando os seguintes critérios são atendidos:

  • Há uma única credencial que corresponde à solicitação, que pode ser uma Conta do Google ou uma senha, e essa credencial corresponde à conta padrão no dispositivo Android.
  • O usuário não saiu da conta.
  • O usuário não desativou o login automático nas configurações da Conta do Google.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Lembre-se de processar a saída corretamente ao implementar o login automático, para que os usuários sempre possam escolher a conta adequada depois de sair explicitamente do app.

Defina um valor de uso único para melhorar a segurança

Para melhorar a segurança do login e evitar ataques de repetição, adicione setNonce para incluir um valor de uso único em cada solicitação. Saiba mais sobre como gerar um valor de uso único.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Criar o fluxo do recurso "Fazer login com o Google"

As etapas para configurar um fluxo do recurso Fazer login com o Google são estas:

  1. Instancie o GetCredentialRequest e adicione o googleIdOption criado anteriormente para recuperar as credenciais.
  2. Transmita essa solicitação para a chamada getCredential() (Kotlin) ou getCredentialAsync() (Java) para extrair as credenciais disponíveis do usuário.
  3. Quando a API for bem-sucedida, extraia a CustomCredential que contém o resultado dos dados GoogleIdTokenCredential.
  4. O tipo de CustomCredential precisa ser igual ao valor de GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Converta o objeto em um GoogleIdTokenCredential usando o método GoogleIdTokenCredential.createFrom.
  5. Se a conversão for bem-sucedida, extraia o ID GoogleIdTokenCredential, valide-o e autentique a credencial no seu servidor.

  6. Se a conversão falhar com uma GoogleIdTokenParsingException, talvez seja necessário atualizar a versão da biblioteca do recurso Fazer login com o Google.

  7. Capture todos os tipos de credenciais personalizadas não reconhecidos.

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {

    // Passkey credential
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    // Password credential
    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    // GoogleIdToken credential
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Acionar um fluxo do botão "Fazer login com o Google"

Para acionar o fluxo do botão "Fazer login com o Google", use GetSignInWithGoogleOption em vez de GetGoogleIdOption:

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
  .setServerClientId(WEB_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Processe o GoogleIdTokenCredential retornado conforme descrito no exemplo de código a seguir.

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      }
      else -> {
        // Catch any unrecognized credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Depois de instanciar a solicitação de login do Google, inicie o fluxo de autenticação de maneira semelhante, conforme mencionado na seção Fazer login com o Google.

Ativar a inscrição de novos usuários (recomendado)

O Fazer login com o Google é a maneira mais fácil para os usuários criarem uma nova conta com seu app ou serviço com apenas alguns toques.

Se nenhuma credencial salva for encontrada (nenhuma Conta do Google retornada por getGoogleIdOption), solicite que seu usuário se inscreva. Primeiro, verifique se setFilterByAuthorizedAccounts(true) para ver se existe alguma conta usada anteriormente. Se nenhum for encontrado, solicite que o usuário se inscreva com a Conta do Google usando setFilterByAuthorizedAccounts(false).

Exemplo:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Depois de instanciar a solicitação de inscrição do Google, inicie o fluxo de autenticação. Se os usuários não quiserem se inscrever no Google, considere usar os serviços de preenchimento automático ou as chaves de acesso para criar contas.

Processar a saída

Quando um usuário sair do app, chame o método clearCredentialState() da API para limpar o estado atual da credencial do usuário de todos os provedores de credenciais. Isso notifica todos os provedores de credenciais de que qualquer sessão de credenciais armazenada para o app em questão precisa ser apagada.

Um provedor de credenciais pode ter armazenado uma sessão de credencial ativa e a usa para limitar as opções de login para futuras chamadas get-credential. Por exemplo, ele pode priorizar a credencial ativa em relação a qualquer outra credencial disponível. Quando o usuário sair explicitamente do app e para acessar as opções de login holísticas na próxima vez, chame essa API para permitir que o provedor limpe qualquer sessão de credenciais armazenada.