Login de conta vinculada para Android

Com o login de conta vinculada, os usuários podem usar o Fazer login com o Google com um toque. que já têm uma Conta do Google vinculada ao seu serviço. Isso melhora a para os usuários, já que eles podem fazer login com um clique, sem precisar nome de usuário e senha. Isso também reduz as chances de os usuários criarem contas duplicadas no seu serviço.

O login com conta vinculada está disponível como parte do fluxo de login com um toque para Android Isso significa que você não precisa importar uma biblioteca separada se o app já tiver o recurso de um toque ativado.

Neste documento, você aprenderá a modificar seu aplicativo Android para oferecer suporte Login da conta vinculada.

Como funciona

  1. Você ativa a exibição das contas vinculadas durante o fluxo de login com um toque.
  2. Se o usuário estiver conectado ao Google e tiver vinculado a Conta do Google ao a conta dele em seu serviço, um token de ID será retornado para o do Compute Engine.
  3. O usuário recebe uma solicitação de login com um toque com uma opção para fazer login na sua com a conta vinculada.
  4. Se o usuário optar por continuar com a conta vinculada, o token de ID do usuário é retornado ao seu app. Você faz a correspondência com o token que foi enviado ao seu na etapa 2 para identificar o usuário conectado.

Configuração

Configurar o ambiente de desenvolvimento

Instale a versão mais recente do Google Play Services no seu host de desenvolvimento:

  1. Abra o Android SDK Manager:
.
  1. Em SDK Tools, encontre Google Play Services.

  2. Se o status desses pacotes não for Instalado, selecione-os e clique em Instalar pacotes.

Configurar o app

  1. No arquivo build.gradle do projeto, inclua o repositório Maven do Google. nas seções buildscript e allprojects.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. Adicione as dependências do recurso "Vincular com o Google". a API do arquivo arquivo do Gradle no nível do app, que geralmente é app/build.gradle:

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.2.0'
    }
    

Modificar seu app Android para oferecer suporte ao login de conta vinculada

Ao final do fluxo de login da conta vinculada, um token de ID é retornado à sua app. A integridade do token de ID precisa ser verificada antes do login do usuário.

O exemplo de código a seguir detalha as etapas a serem recuperadas. verificar o token de ID e, em seguida, fazer o login do usuário.

  1. Criar uma atividade para receber o resultado da intent de login

    Kotlin

      private val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
          try {
            val signInCredentials = Identity.signInClient(this)
                                    .signInCredentialFromIntent(result.data)
            // Review the Verify the integrity of the ID token section for
            // details on how to verify the ID token
            verifyIdToken(signInCredential.googleIdToken)
          } catch (e: ApiException) {
            Log.e(TAG, "Sign-in failed with error code:", e)
          }
        } else {
          Log.e(TAG, "Sign-in failed")
        }
      }
    

    Java

      private final ActivityResultLauncher<IntentSenderResult>
        activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
        If (result.getResultCode() == RESULT_OK) {
            try {
              SignInCredential signInCredential = Identity.getSignInClient(this)
                             .getSignInCredentialFromIntent(result.getData());
              verifyIdToken(signInCredential.getGoogleIdToken());
            } catch (e: ApiException ) {
              Log.e(TAG, "Sign-in failed with error:", e)
            }
        } else {
            Log.e(TAG, "Sign-in failed")
        }
    });
    
  2. Criar a solicitação de login

    Kotlin

    private val tokenRequestOptions =
    GoogleIdTokenRequestOptions.Builder()
      .supported(true)
      // Your server's client ID, not your Android client ID.
      .serverClientId(getString("your-server-client-id")
      .filterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                               scopes)
      .build()
    

    Java

     private final GoogleIdTokenRequestOptions tokenRequestOptions =
         GoogleIdTokenRequestOptions.Builder()
      .setSupported(true)
      .setServerClientId("your-service-client-id")
      .setFilterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                                scopes)
      .build()
    
  3. Iniciar a intent de login pendente

    Kotlin

     Identity.signInClient(this)
        .beginSignIn(
      BeginSignInRequest.Builder()
        .googleIdTokenRequestOptions(tokenRequestOptions)
      .build())
        .addOnSuccessListener{result ->
          activityResultLauncher.launch(result.pendingIntent.intentSender)
      }
      .addOnFailureListener {e ->
        Log.e(TAG, "Sign-in failed because:", e)
      }
    

    Java

     Identity.getSignInClient(this)
      .beginSignIn(
        BeginSignInRequest.Builder()
          .setGoogleIdTokenRequestOptions(tokenRequestOptions)
          .build())
      .addOnSuccessListener(result -> {
        activityResultLauncher.launch(
            result.getPendingIntent().getIntentSender());
    })
    .addOnFailureListener(e -> {
      Log.e(TAG, "Sign-in failed because:", e);
    });
    

Verificar a integridade do token de ID

Para verificar se o token é válido, verifique se: critérios sejam atendidos:

  • O token de ID está devidamente assinado pelo Google. Usar as chaves públicas do Google (disponível em JWK ou PEM) para verificar a assinatura do token. Essas chaves são trocadas regularmente. examinar o cabeçalho Cache-Control na resposta para determinar quando você deve recuperá-las novamente.
  • O valor de aud no token de ID é igual a um dos IDs de clientes. Essa verificação é necessária para evitar que os tokens de ID emitidos para um dispositivo app sendo usado para acessar dados sobre o mesmo usuário no servidor de back-end do seu app.
  • O valor de iss no token de ID é igual a accounts.google.com ou https://accounts.google.com.
  • O prazo de validade (exp) do token de ID não passou.
  • Se você precisar validar se o token de ID representa uma conta do Google Workspace ou da organização, verifique a declaração hd, que indica o servidor domínio do usuário. Isso deve ser usado ao restringir o acesso a um recurso apenas a membros da determinados domínios. A ausência dessa reivindicação indica que a conta não pertence a Domínio hospedado pelo Google.

Usando os campos email, email_verified e hd, é possível determinar se O Google hospeda e é autoritativo para um endereço de e-mail. Nos casos em que o Google é confiável, o usuário é conhecido como o proprietário legítimo da conta, e você pode ignorar a senha ou outras e métodos de desafio.

Casos em que o Google é confiável:

  • email tem o sufixo @gmail.com. Esta é uma conta do Gmail.
  • A opção email_verified é verdadeira e hd foi definida. Esta é uma conta do G Suite.

Os usuários podem se registrar para Contas do Google sem usar o Gmail ou o G Suite. Quando email não contém um sufixo @gmail.com e hd está ausente, o Google não está com autoridade e senha ou outros métodos de desafio o usuário. email_verified também pode ser verdadeiro porque o Google verificou inicialmente o usuário quando a Conta do Google foi criada, mas a propriedade do terceiro pode ter mudado desde então.

Em vez de escrever seu próprio código para executar essas etapas de verificação, é altamente recomendamos o uso de uma biblioteca de cliente de API do Google para sua plataforma ou uma biblioteca JWT. Para desenvolvimento e depuração, você pode chamar nossa classe tokeninfo endpoint de validação.

Usar uma biblioteca de cliente das APIs do Google

Usando o Biblioteca de cliente das APIs do Google para Java é a forma recomendada de validar tokens de ID do Google em um ambiente de produção.

Java

  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

  ...

  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
      // Specify the CLIENT_ID of the app that accesses the backend:
      .setAudience(Collections.singletonList(CLIENT_ID))
      // Or, if multiple clients access the backend:
      //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
      .build();

  // (Receive idTokenString by HTTPS POST)

  GoogleIdToken idToken = verifier.verify(idTokenString);
  if (idToken != null) {
    Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // Use or store profile information
    // ...

  } else {
    System.out.println("Invalid ID token.");
  }

O método GoogleIdTokenVerifier.verify() verifica a assinatura JWT, a aud, iss e exp reivindicação.

Se você precisar validar que o token de ID representa uma conta de organização do Google Workspace ou do Cloud, verifique a declaração hd verificando o nome de domínio retornado pelo método Payload.getHostedDomain().

Como chamar o endpoint tokeninfo

Uma maneira fácil de validar uma assinatura de token de ID para depuração é use o endpoint tokeninfo. Chamar esse endpoint envolve uma solicitação de rede adicional que faz a maior parte da validação para você enquanto você testa as dependências validação e extração de payload no próprio código. Ele não é adequado para uso em produção já que as solicitações podem ser limitadas ou sujeitas a erros intermitentes.

Para validar um token de ID usando o endpoint tokeninfo, crie um solicitação POST ou GET para o ponto de extremidade e passe seu token de ID na parâmetro id_token. Por exemplo, para validar o token "XYZ123", faça a seguinte solicitação GET:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Se o token estiver assinado corretamente e os iss e exp têm os valores esperados, você receberá uma resposta HTTP 200, em que o corpo contém as declarações do token de ID no formato JSON. Veja um exemplo de resposta:

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Se você precisar confirmar que o token de ID representa uma conta do Google Workspace, verifique a declaração hd, que indica o domínio hospedado do usuário. Deve ser usado quando restringir o acesso a um recurso apenas para membros de determinados domínios. A ausência desta declaração indica que a conta não pertence a um domínio hospedado do Google Workspace.