La fonctionnalité de connexion à un compte associé active la connexion avec Google One Tap pour les utilisateurs. dont le compte Google est déjà associé à votre service. Cela améliore pour les utilisateurs, car ils peuvent se connecter en un clic, sans avoir à saisir à nouveau leur nom d'utilisateur et leur mot de passe. Cela réduit également les risques que les utilisateurs créent des comptes en double sur votre service.
La connexion à un compte associé est disponible dans le cadre de la procédure de connexion One Tap pour Android Cela signifie que vous n'avez pas besoin d'importer une bibliothèque distincte si votre application a déjà activé la fonctionnalité One Tap.
Dans ce document, vous découvrirez comment modifier votre application Android pour la rendre Connexion à un compte associé.
Fonctionnement
- Vous choisissez d'afficher les comptes associés pendant le processus de connexion avec One Tap.
- Si l'utilisateur est connecté à Google et a associé son compte Google à leur compte sur votre service, un jeton d'identification est renvoyé pour le compte de service.
- 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é, son jeton d'ID est renvoyé à votre application. Vous le mettez en correspondance avec le jeton qui a été 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 le Android SDK Manager
Sous SDK Tools, recherchez Services Google Play.
Si l’état de ces packages n’est pas installé, sélectionnez-les tous les deux et 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() } }
Ajouter les dépendances pour "Associer à Google" vers l'API Cloud de votre module fichier Gradle au niveau de l'application, généralement
app/build.gradle
:dependencies { implementation 'com.google.android.gms:play-services-auth:21.2.0' }
Modifier votre application Android pour qu'elle prenne 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, vérifier le jeton d'ID, puis connecter 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
Pour vérifier que le jeton est valide, assurez-vous que les éléments suivants critères sont remplis:
- Le jeton d'ID est correctement signé par Google. Utiliser les clés publiques de Google
(disponible en
JWK ou
PEM).
pour vérifier la signature du jeton. Ces clés font l'objet d'une rotation régulière. examiner
l'en-tête
Cache-Control
dans la réponse pour déterminer quand vous devez les récupérer à nouveau. - La valeur de
aud
dans le jeton d'ID est égale à l'une des d'identifiants clients. Cette vérification est nécessaire pour empêcher les jetons d'identification émis vers application utilisée pour accéder aux données concernant le même utilisateur sur le serveur backend de votre application. - La valeur de
iss
dans le jeton d'ID est égale àaccounts.google.com
ouhttps://accounts.google.com
. - Le délai d'expiration (
exp
) du jeton d'ID n'est pas écoulé. - Si vous devez vérifier que le jeton d'ID représente un compte Google Workspace ou
compte d'organisation, vous pouvez consulter la revendication
hd
, qui indique domaine de l'utilisateur. Il doit être utilisé lorsque vous restreignez l'accès à une ressource aux seuls membres de certains domaines. L'absence de cette réclamation indique que le compte n'appartient pas à un Domaine hébergé par Google.
À l'aide des champs email
, email_verified
et hd
, vous pouvez déterminer
Google héberge les adresses e-mail et fait autorité pour celles-ci. Dans les cas où Google fait autorité,
l'utilisateur est connu comme étant le titulaire légitime du compte, et vous pouvez ignorer le mot de passe ou d'autres
méthodes de défi.
Cas dans lesquels Google fait autorité:
email
comporte le suffixe@gmail.com
. Il s'agit d'un compte Gmail.email_verified
est "true" ethd
est défini. Il s'agit d'un compte G Suite.
Les utilisateurs peuvent créer un compte Google sans utiliser Gmail ni G Suite. Quand ?
email
ne contient pas de suffixe @gmail.com
et hd
est absent, Google ne l'est pas
faisant autorité et un mot de passe ou d'autres
méthodes d'authentification sont recommandés pour
l'utilisateur. email_verified
peut également être défini sur "true", car Google a initialement validé
utilisateur lors de la création du compte Google, quelle que soit la propriété du tiers
compte de messagerie peut avoir changé depuis.
Plutôt que d'écrire votre propre code pour effectuer ces vérifications, nous vous recommandons
vous pouvez utiliser une bibliothèque cliente des API Google pour votre plate-forme
JWT. Pour le développement et le débogage, vous pouvez appeler notre tokeninfo
point de terminaison de validation.
Utiliser une bibliothèque cliente d'API Google
Avec les Bibliothèque cliente des API Google pour Java est la méthode recommandée 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'ID représente un compte Google Workspace ou
compte d'organisation, vous pouvez valider la revendication hd
en consultant le nom de domaine
renvoyé par la méthode Payload.getHostedDomain()
.
Appeler le point de terminaison tokeninfo
Pour valider facilement la signature d'un jeton d'ID pour le débogage, procédez comme suit :
utilisez le point de terminaison tokeninfo
. L'appel de ce point de terminaison implique
une requête réseau supplémentaire qui effectue la majeure partie de la validation à votre place pendant que vous testez
la validation et l'extraction de la charge utile dans votre propre code. Il n'est pas adapté à une utilisation en production
car les requêtes peuvent être limitées ou soumises à des erreurs intermittentes.
Pour valider un jeton d'ID à l'aide du point de terminaison tokeninfo
, créez un
POST ou GET au point de terminaison, puis transmettez votre jeton d'identification dans la
Paramètre id_token
.
Par exemple, pour valider le jeton "XYZ123", effectuez la requête GET suivante:
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123
Si le jeton est correctement signé, et si iss
et exp
revendications ont les valeurs attendues, vous obtenez une réponse HTTP 200, dans laquelle le corps
contient les revendications de jeton d'ID au format JSON.
Voici un exemple de réponse :
{ // These six fields are included in all Google ID Tokens. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // These seven fields are only included when the user has granted the "profile" and // "email" OAuth scopes to the application. "email": "testuser@gmail.com", "email_verified": "true", "name" : "Test User", "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "User", "locale": "en" }
Pour vérifier que le jeton d'ID représente un compte Google Workspace, vous pouvez vérifier
La revendication hd
, qui indique le domaine hébergé de l'utilisateur Il doit être utilisé lorsque
restreindre l'accès à une ressource
aux seuls membres de certains domaines. L'absence de cette réclamation
indique que le compte n'appartient pas à un domaine hébergé par Google Workspace.