Fazer login usando tokens de ID

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

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

Para fazer login com um token de ID, primeiro recupere esse token com o método getIdTokens. Em seguida, envie o token do ID para o back-end do 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 isso acontecer, chame getIdTokens para recuperá-la e enviá-la ao 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 POST de HTTPS, verifique a assinatura do token e as declarações aud, iss e exp dele.

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 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 '+/' '-
'

Também é possível gerar o hash SHA-512 examinando um token de ID válido.

As bibliotecas JWT podem processar algumas dessas tarefas de verificação para você. Por exemplo, usando a biblioteca de cliente das APIs 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 mais detalhes.