Fazer login usando tokens de ID

Depois de recuperar as credenciais de um usuário ou as dicas de login, verifique se um token de ID está disponível para a credencial. Um token de ID é uma declaração assinada da identidade de um usuário que também contém informações básicas de perfil do usuário, possivelmente incluindo um endereço de e-mail verificado pelo Google. Quando os tokens de ID estiverem disponíveis, você pode usá-los para autenticar com segurança com o back-end do seu app ou para pular a etapa de verificação de e-mail ao criar uma nova conta.

Um token de ID está disponível quando um ID do usuário de objeto Credential corresponde ao ID do usuário de uma Conta do Google conectada ao dispositivo.

Para fazer login com um token de ID, primeiro recupere o token de ID com o método getIdTokens. Em seguida, envie o token de ID para o back-end do seu app. No back-end, verifique o token usando uma biblioteca de cliente da API do Google ou uma biblioteca JWT de uso geral.

Antes de começar

Receber um token de ID do objeto Credentials

Depois de recuperar as credenciais de um usuário, verifique se o objeto Credentials inclui um token de ID. Se sim, chame getIdTokens para recuperá-lo e enviá-lo para o back-end por HTTPS POST.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

Verificar o token de ID no back-end

Depois de receber o token de ID por HTTPS POST, você precisa verificar a assinatura do token e as declarações aud, iss e exp do token.

A declaração aud de um token de ID do Smart Lock para senhas tem o seguinte formato:

android://SHA512_HASH@ANDROID_PACKAGE_NAME
.

O valor SHA512HASH é o hash SHA-512 do seu certificado de assinatura. É possível conseguir esse valor usando os utilitários keytool e openssl:

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

Você também pode conseguir o hash SHA-512 examinando um token de ID que você sabe que é válido.

As bibliotecas JWT podem processar algumas dessas tarefas de verificação para você. Por exemplo, usando a biblioteca de cliente da API do Google para 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;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

Consulte a documentação do Login do Google para ver mais detalhes.