Accede con tokens de ID

Una vez que hayas recuperado las credenciales de un usuario o las sugerencias de acceso de forma correcta, 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 de perfil de este, que puede incluir una dirección de correo electrónico verificada por Google. Cuando los tokens de ID están disponibles, puedes usarlos para autenticar de forma segura con el backend de la app, o bien omitir el paso de verificación por correo electrónico cuando creas una cuenta nueva.

Existe un token de ID disponible cuando el ID de usuario de un objeto Credential coincide con el de una Cuenta de Google con la que se accedió al 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 mediante 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 mediante HTTPS POST, debes verificar la firma del token y verificar sus reclamaciones aud, iss y exp.

La reclamación 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 '+/' '-
'

O bien, puedes obtener el hash SHA-512 si examinas 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 cliente de las API de 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.");
}

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