Fazer login usando tokens de ID

Depois de recuperar as credenciais de um usuário ou recuperar 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 do perfil de um usuário, possivelmente incluindo um endereço de e-mail verificado pelo Google. Quando os tokens de ID estão disponíveis, é possível usá-los para autenticar com segurança o back-end do app ou para pular a etapa de verificação de e-mail ao criar uma conta.

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

Para fazer login com um token de ID, primeiro recupere o token com o método getIdTokens. Em seguida, envie o token de ID para o back-end do app. No back-end, verifique o token usando uma biblioteca de cliente das APIs 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 for, chame getIdTokens para recuperá-lo e envie para seu 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, verifique a assinatura do token e as declarações aud, iss e exp.

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

Ou você pode examinar um token de ID que sabe ser válido para conseguir o hash SHA-512.

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