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
- Tu app debe poder recuperar correctamente las credenciales de un usuario. o recupera una sugerencia de acceso.
- Debes llamar a
setAccountTypes(IdentityProviders.GOOGLE)
cuando compiles el ObjetosCredentialRequest
yHintRequest
.
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.