Se connecter à l'aide de jetons d'ID

Après avoir récupéré les identifiants d'un utilisateur ou les suggestions de connexion, vous pouvez vérifier si un jeton d'ID est disponible pour cet identifiant. Un jeton d'identification est une assertion signée de l'identité d'un utilisateur qui contient également des informations de base sur son profil, y compris une adresse e-mail validée par Google. Lorsque des jetons d'identification sont disponibles, vous pouvez les utiliser pour vous authentifier de manière sécurisée auprès du backend de votre application ou pour ignorer l'étape de validation de l'adresse e-mail lorsque vous créez un compte.

Un jeton d'ID est disponible lorsque l'ID utilisateur d'un objet Credential correspond à l'ID utilisateur d'un compte Google connecté sur l'appareil.

Pour vous connecter avec un jeton d'ID, commencez par le récupérer à l'aide de la méthode getIdTokens. Envoyez ensuite le jeton d'ID au backend de votre application. Sur le backend, vérifiez le jeton à l'aide d'une bibliothèque cliente de l'API Google ou d'une bibliothèque JWT à usage général.

Avant de commencer

Obtenir un jeton d'ID à partir de l'objet Credentials

Après avoir récupéré les identifiants d'un utilisateur, vérifiez si l'objet Credentials inclut un jeton d'ID. Si c'est le cas, appelez getIdTokens pour le récupérer, puis envoyez-le à votre backend via 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);
    }
}

Vérifier le jeton d'ID sur le backend

Après avoir reçu le jeton d'ID via HTTPS POST, vous devez vérifier la signature du jeton, ainsi que les revendications aud, iss et exp du jeton.

La revendication aud d'un jeton d'ID de Smart Lock pour les mots de passe se présente au format suivant :

android://SHA512_HASH@ANDROID_PACKAGE_NAME

La valeur SHA512HASH correspond au hachage SHA-512 de votre certificat de signature. Vous pouvez obtenir cette valeur à l'aide des utilitaires keytool et openssl :

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

Vous pouvez également obtenir le hachage SHA-512 en examinant un jeton d'ID valide.

Les bibliothèques JWT peuvent gérer certaines de ces tâches de validation à votre place. Par exemple, si vous utilisez la bibliothèque cliente des API Google pour 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.");
}

Pour en savoir plus, consultez la documentation Google Sign-In.