La connexion avec un compte associé permet aux utilisateurs qui ont déjà associé leur compte Google à votre service d'utiliser la connexion avec Google avec One Tap. Cela améliore l'expérience utilisateur, car il peut se connecter en un clic, sans avoir à saisir de nouveau son nom d'utilisateur et son mot de passe. Cela réduit également les risques que les utilisateurs créent des comptes en double sur votre service.
La connexion avec un compte associé est disponible dans le parcours de connexion en un seul geste pour Android. Cela signifie que vous n'avez pas besoin d'importer une bibliothèque distincte si la fonctionnalité de paiement sans contact est déjà activée dans votre application.
Dans ce document, vous allez découvrir comment modifier votre application Android pour qu'elle prenne en charge la connexion avec un compte associé.
Fonctionnement
- Vous activez l'affichage des comptes associés lors du processus de connexion en un seul geste.
- Si l'utilisateur est connecté à Google et a associé son compte Google à son compte sur votre service, un jeton d'ID est renvoyé pour le compte associé.
- Une invite de connexion avec One Tap s'affiche, avec la possibilité de se connecter à votre service avec le compte associé.
- Si l'utilisateur choisit de continuer avec le compte associé, le jeton d'ID de l'utilisateur est renvoyé dans votre application. Vous le comparez au jeton envoyé à votre serveur à l'étape 2 pour identifier l'utilisateur connecté.
Configuration
Configurer l'environnement de développement
Obtenez les derniers services Google Play sur votre hôte de développement:
- Ouvrez Android SDK Manager.
Sous SDK Tools (Outils SDK), recherchez Google Play services (Services Google Play).
Si l'état de ces packages n'est pas "Installé", sélectionnez-les tous les deux, puis cliquez sur Installer les packages.
Configurer votre application
Dans le fichier
build.gradle
au niveau du projet, incluez le dépôt Maven de Google dans les sectionsbuildscript
etallprojects
.buildscript { repositories { google() } } allprojects { repositories { google() } }
Ajoutez les dépendances de l'API "Link with Google" au fichier Gradle au niveau de l'application de votre module, qui est généralement
app/build.gradle
:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Modifier votre application Android pour prendre en charge la connexion avec un compte associé
À la fin du flux de connexion au compte associé, un jeton d'ID est renvoyé à votre application. L'intégrité du jeton d'ID doit être vérifiée avant de connecter l'utilisateur.
L'exemple de code suivant détaille les étapes à suivre pour récupérer, valider le jeton d'ID et connecter ensuite l'utilisateur.
Créer une activité pour recevoir le résultat de l'intent de connexion
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }
Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });
Créer la requête de connexion
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Lancer l'intent de connexion en attente
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }
Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
Vérifier l'intégrité du jeton d'ID
Utiliser une bibliothèque cliente d'API Google
Nous vous recommandons d'utiliser la bibliothèque cliente des API Google Java pour valider les jetons d'ID Google dans un environnement de production.
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;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
La méthode GoogleIdTokenVerifier.verify()
vérifie la signature JWT, la revendication aud
, la revendication iss
et la revendication exp
.
Si vous devez vérifier que le jeton d'identité représente un compte Google Workspace ou Cloud Organization, vous pouvez valider la revendication hd
en vérifiant le nom de domaine renvoyé par la méthode Payload.getHostedDomain()
.