Accede con tokens de ID

Después de recuperar correctamente las credenciales de un usuario o recuperar sugerencias de acceso, puedes verificar si hay un token de ID disponible para la credencial. Un token de ID es una aserción firmada de la identidad de un usuario que también contiene información básica del perfil del usuario, posiblemente incluida una dirección de correo electrónico que Google verificó. Cuando los tokens de ID están disponibles, puedes usarlos para autenticarte de forma segura con el backend de tu app o para omitir el paso de verificación de correo electrónico cuando creas una cuenta nueva.

Un token de ID está disponible cuando el ID de usuario de un objeto Credential coincide con el ID de usuario de una Cuenta de Google a la que se accedió en el dispositivo.

Para acceder con un token de ID, primero recupera el token de ID con el método getIdTokens. Luego, envía el token de ID al backend de tu app. En el backend, verifica el token con una biblioteca cliente de la API de Google o una biblioteca JWT de uso general.

Antes de comenzar

Obtén un token de ID del objeto Credentials

Después de recuperar las credenciales de un usuario, verifica si el objeto Credentials incluye un token de ID. Si es así, llama a getIdTokens para recuperarlo y envíalo a tu backend a través de 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);
    }
}

Verifica el token de ID en el backend

Después de recibir el token de ID por HTTPS POST, debes verificar la firma del token y las declaraciones aud, iss y exp del token.

El reclamo aud de un token de ID de Smart Lock para contraseñas tiene el siguiente formato:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

El valor SHA512HASH es el hash SHA-512 de tu certificado de firma. Puedes obtener este valor con las utilidades keytool y openssl:

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

También puedes obtener el hash SHA-512 examinando un token de ID que sepas que es válido.

Las bibliotecas de JWT pueden controlar algunas de estas tareas de verificación por ti. Por ejemplo, con la biblioteca de 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.");
}

Consulta la documentación de Acceso con Google para obtener más detalles.