Se connecter à l'aide de jetons d'ID

Une fois que vous avez récupéré les identifiants d'un utilisateur ou récupéré les indices de connexion, vous pouvez vérifier si un jeton d'identité est disponible pour les identifiants. Un jeton d'identité est une assertion signée de l'identité d'un utilisateur. Il contient également des informations de profil de base de l'utilisateur, y compris éventuellement une adresse e-mail validée par Google. Lorsque des jetons d'identité 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 lors de la création d'un compte.

Un jeton d'identité 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'identité, récupérez d'abord le jeton d'identité avec la méthode getIdTokens. Envoyez ensuite le jeton d'identité au backend de votre application. Dans le backend, validez le jeton à l'aide d'une bibliothèque cliente des API Google ou d'une bibliothèque JWT à usage général.

Avant de commencer

Obtenir un jeton d'identification à 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 et envoyez-le à votre backend par 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);
    }
}

Valider le jeton d'identité sur le backend

Une fois que vous avez reçu le jeton d'identité par 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'identité provenant de Smart Lock pour les mots de passe présente le 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'identité que vous savez valide.

Les bibliothèques JWT peuvent gérer certaines de ces tâches de validation pour vous. Par exemple, en utilisant la bibliothèque Google Auth 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 sur Google Sign-In.