Accede con tokens de ID

Después de recuperar correctamente las credenciales de un usuario o sugerencias de acceso recuperadas, puedes verificar si hay un token de ID disponible para la credencial. Un token de ID es un confirmación firmada de la identidad de un usuario que también contiene su perfil básico información, incluida una dirección de correo electrónico que haya sido verificada por Google. Cuando haya tokens de ID disponibles, podrás usarlos para autentica con el backend de tu app u omite el paso de verificación por correo electrónico cuando crees una cuenta nueva.

Un token de ID está disponible cuando el ID de usuario de un objeto Credential coincide con el usuario ID 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 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 un token JWT de uso general biblioteca.

Antes de comenzar

Cómo obtener un token de ID desde el objeto Credentials

Cuando recuperes las credenciales de un usuario, verifica si el objeto Credentials incluye un token de ID. Si es así, llama a getIdTokens para recuperarlo y enviarlo 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

Luego de recibir el token de ID a través de HTTPS POST, debes verificar el token firma y verifica las reclamaciones aud, iss y exp del token.

La reclamación aud de un token de ID de Smart Lock para contraseñas tiene lo siguiente: formato:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

El valor SHA512HASH es el hash SHA-512 de tu firma certificado. 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 JWT pueden realizar algunas de estas tareas de verificación por ti. Por ejemplo: con la biblioteca cliente de la 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 de Acceso con Google. para obtener más información.