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
- Votre application doit pouvoir récupérer les identifiants d'un utilisateur ou récupérer un indice de connexion.
- Vous devez appeler
setAccountTypes(IdentityProviders.GOOGLE)
lorsque vous créez les objetsCredentialRequest
etHintRequest
.
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.