Autenticar usuários com o recurso "Fazer login com o Google"

O Login do Google ajuda você a integrar rapidamente a autenticação de usuários ao seu app Android. Os usuários podem usar a Conta do Google para fazer login no seu app, dar consentimento e compartilhar com segurança as informações do perfil com ele. A biblioteca Credential Manager Jetpack 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 inscrição e login com um toque otimizadas para apps. Para uma migração de dispositivo tranquila, o recurso Fazer login com o Google é compatível com o login automático, e a natureza multiplataforma em Android, iOS e Web ajuda você a fornecer acesso de login para seu app em qualquer dispositivo. Se você usa o Firebase Authentication no seu aplicativo, saiba mais sobre como integrar o Login do Google e o Credential Manager no guia Autenticar com o Google no Android.

Para configurar o Fazer login com o Google, siga estas duas etapas principais:

Configure 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 pedir 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 lembrar a opção usada anteriormente para fazer login.

Página inferior do Gerenciador de credenciais
Figura 1. A página inferior do Credential Manager interface de seleção de credenciais

Adicione o botão "Fazer login com o Google" à interface do app. O botão "Fazer login com o Google" oferece uma maneira simplificada para os usuários usarem as 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 folha inferior ou se quiserem usar a Conta do Google para se inscrever e fazer login. Para os desenvolvedores, isso significa facilitar a integração de usuários e reduzir o atrito durante a inscrição.

Animação mostrando o fluxo de login do Google
Figura 2. A 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 Google ID.

Crie o projeto

  1. Abra seu projeto no ou crie um se ainda não tiver.
  2. Na , confira se todas as informações estão completas e corretas.
    1. Confira se o app tem um nome, um logotipo e uma página inicial corretos. Esses valores serão apresentados aos usuários na tela de consentimento do recurso "Fazer login com o Google" ao se inscreverem 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. No , crie um ID de cliente do Android para seu app se você ainda não tiver um. Você precisará especificar o nome do pacote e a assinatura SHA-1 do app.
    1. Acesse a .
    2. Clique em Criar cliente.
    3. Selecione o tipo de aplicativo Android.
  4. No , crie um ID do cliente "Aplicativo da Web" se ainda não tiver feito isso. Por enquanto, ignore os campos "Origens JavaScript autorizadas" e "URIs de redirecionamento autorizados". Esse ID do cliente 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 .
    2. Clique em Criar cliente.
    3. Selecione o tipo Aplicativo da Web.

Declarar dependências

No arquivo build.gradle do módulo, declare 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 iniciar sua 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)
  // nonce string to use when generating a Google ID token
  .setNonce(nonce)
.build()

Primeiro, verifique se o usuário tem contas que já foram usadas 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 não houver Contas do Google autorizadas disponíveis, o usuário vai precisar fazer inscrição com uma das contas disponíveis. Para isso, peça ao usuário chamando a API novamente e definindo setFilterByAuthorizedAccounts como false. Saiba mais sobre a inscrição.

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

Os desenvolvedores precisam ativar o login automático para usuários que se inscrevem com uma única conta. Isso proporciona uma experiência integrada em todos os dispositivos, especialmente durante a migração de dispositivos, em que os usuários podem recuperar rapidamente o acesso à conta sem precisar inserir as credenciais novamente. Para seus usuários, isso remove o atrito desnecessário quando eles já estavam conectados.

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

  • Há uma única credencial correspondente à 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 explicitamente.
  • 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)
  // nonce string to use when generating a Google ID token
  .setNonce(nonce)
.build()

Não se esqueça de processar a saída corretamente ao implementar o login automático para que os usuários sempre possam escolher a conta certa depois de sair explicitamente do seu app.

Definir um nonce para melhorar a segurança

Para melhorar a segurança de 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)
  // nonce string to use when generating a Google ID token
  .setNonce(nonce)
.build()

Criar o fluxo "Fazer login com o Google"

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

  1. Instancie um GetCredentialRequest e adicione o googleIdOption criado anteriormente usando addCredentialOption() para extrair 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 uma GoogleIdTokenCredential usando o método GoogleIdTokenCredential.createFrom.
  5. Se a conversão for bem-sucedida, extraia e valide o ID da GoogleIdTokenCredential, depois, 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 = GetCredentialRequest.Builder()
  .addCredentialOption(googleIdOption)
  .build()

coroutineScope {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    // Handle failure
  }
}
fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential
  val responseJson: String

  when (credential) {

    // Passkey credential
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse to 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 the ID to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
          // You can use the members of googleIdTokenCredential directly for UX
          // purposes, but don't use them to store or control access to user
          // data. For that you first need to validate the token:
          // pass googleIdTokenCredential.getIdToken() to the backend server.
          // see [validation instructions](https://developers.google.com/identity/gsi/web/guides/verify-google-id-token)
        } 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(
  serverClientId = WEB_CLIENT_ID
).setNonce(nonce)
  .build()

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

fun handleSignInWithGoogleOption(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 recurso "Fazer login com o Google" é a maneira mais fácil de os usuários criarem uma nova conta com seu app ou serviço em apenas alguns toques.

Se nenhuma credencial salva for encontrada (nenhuma Conta do Google retornada por getGoogleIdOption), peça ao usuário para se inscrever. Primeiro, verifique se setFilterByAuthorizedAccounts(true) para saber se há contas usadas anteriormente. Se nenhum for encontrado, peça ao usuário para se inscrever com a Conta do Google usando setFilterByAuthorizedAccounts(false)

Exemplo:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(WEB_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 usar o Login com o Google para se inscrever, considere otimizar seu app para preenchimento automático. Depois que o usuário criar uma conta, considere inscrever a pessoa em chaves de acesso como uma etapa final da criação da conta.

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 vai notificar todos os provedores de credenciais de que qualquer sessão de credencial armazenada para o app em questão deve ser limpa.

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