Fazer login usando tokens de ID

Depois de recuperar as credenciais de um usuário ou dicas de login recuperadas, você pode verificar se um token de ID está disponível para a credencial. Um token de ID é um declaração assinada da identidade de um usuário que também contém o perfil básico de um usuário do usuário, incluindo um endereço de e-mail que tenha sido verificado pelo Google. Quando os tokens de ID estiverem disponíveis, eles poderão ser usados para autenticar com o back-end do app ou pular a etapa de verificação de e-mail ao criar uma nova conta.

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

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

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 ela tiver, chame getIdTokens para recuperar e enviar essa informação 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 HTTPS POST, verifique a propriedade assinatura e verifique 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 da sua assinatura certificado. É 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 obter o hash SHA-512 examinando um token de ID que sabe ser válido.

As bibliotecas JWT podem lidar com 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.