Si vous avez déjà intégré Google Sign-In à l'aide de GoogleAuthUtil.getToken
ou Plus.API
, vous devez migrer vers la dernière API Sign-In pour une sécurité et une expérience utilisateur renforcées.
Migrer depuis un anti-modèle de jeton d'accès
Vous ne devez pas envoyer les jetons d'accès obtenus avec GoogleAuthUtil.getToken
à votre serveur backend en tant qu'assertion d'identité, car vous ne pouvez pas facilement vérifier que le jeton a été émis pour votre backend. Vous êtes donc exposé à l'insertion d'un jeton d'accès par un pirate informatique.
Par exemple, si votre code Android ressemble à l'exemple ci-dessous, vous devez migrer votre application vers les bonnes pratiques actuelles.
Dans l'exemple, les requêtes de jeton d'accès utilisent oauth2:
et une chaîne de champ d'application comme paramètre scope
pour l'appel GoogleAuthUtil.getToken
(oauth2:https://www.googleapis.com/auth/plus.login
).
Au lieu de vous authentifier avec un jeton d'accès acquis avec GoogleAuthUtil.getToken
, utilisez le flux de jeton d'ID ou le flux de code d'authentification.
Migrer vers le flux de jetons d'ID
Si vous n'avez besoin que de l'ID, de l'adresse e-mail, du nom ou de l'URL de la photo de profil de l'utilisateur, utilisez le flux de jeton d'ID.
Pour migrer vers le flux de jetons d'identification, effectuez les modifications suivantes:
Côté client Android
- Supprimer l'autorisation
GET_ACCOUNTS
(Contacts) si vous le demandez - Remplacez tout code utilisant
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
ouAccountManager.newChooseAccountIntent()
parAuth.GOOGLE_SIGN_IN_API
avec la configurationGoogleSignInOptions.Builder.requestIdToken(...)
.
Côté serveur
- Créer un point de terminaison pour l'authentification par jeton d'ID
- Désactivez l'ancien point de terminaison après la migration de vos applications clientes
Migrer vers le flux avec code d'autorisation du serveur
Si votre serveur doit accéder à d'autres API Google, telles que Google Drive, YouTube ou Contacts, utilisez le flux de code d'autorisation du serveur.
Pour migrer vers le flux avec code d'autorisation du serveur, apportez les modifications suivantes:
Côté client Android
- Supprimer l'autorisation
GET_ACCOUNTS
(Contacts) si vous le demandez - Remplacez tout code utilisant
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
ouAccountManager.newChooseAccountIntent()
parAuth.GOOGLE_SIGN_IN_API
avec la configurationGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Côté serveur
- Créer un point de terminaison pour le flux de code d'authentification du serveur
- Désactiver l'ancien point de terminaison une fois vos applications clientes migrées
Vous pouvez toujours partager la logique d'accès aux API entre vos anciens et nouveaux points de terminaison. Exemple :
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...); String accessToken = tokenResponse.getAccessToken(); String refreshToken = tokenResponse.getRefreshToken(); Long expiresInSeconds = tokenResponse.getExpiresInSeconds(); // Shared by your old and new implementation, old endpoint can pass null for refreshToken private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) { GoogleCredential credential = new GoogleCredential.Builder() .setTransPort(...) ... .build(); credential.setAccessToken(accessToken); credential.setExpiresInSeconds(expiresInSeconds); credential.setRefreshToken(refreshToken); }
Migrer depuis le flux de jetons d'ID GoogleAuthUtil
Si vous utilisez GoogleAuthUtil
pour obtenir des jetons d'ID, vous devez passer au nouveau flux de jetons d'ID de l'API Sign-In.
Par exemple, si votre code Android ressemble à l'exemple suivant, vous devez effectuer la migration:
Dans l'exemple, les requêtes de jeton d'ID utilisent audience:server:client_id
ainsi que l'ID client de votre serveur Web comme paramètre "scope" pour l'appel GoogleAuthUtil.getToken
(audience:server:client_id:9414861317621.apps.googleusercontent.com
).
Le nouveau flux de jetons d'ID de l'API Sign-In présente les avantages suivants:
- Expérience de connexion simplifiée en un seul geste
- Votre serveur peut obtenir des informations sur le profil utilisateur sans appel réseau supplémentaire.
Pour migrer vers le flux de jetons d'ID, apportez les modifications suivantes:
Côté client Android
- Supprimer l'autorisation
GET_ACCOUNTS
(Contacts) si vous le demandez - Remplacez tout code utilisant
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
ouAccountManager.newChooseAccountIntent()
parAuth.GOOGLE_SIGN_IN_API
avec la configurationGoogleSignInOptions.Builder.requestIdToken(...)
.
Côté serveur
La nouvelle API Sign-In génère des jetons d'identification conformes à la spécification OpenID Connect, contrairement à GoogleAuthUtil.getToken
, qui utilise un format obsolète.
Plus spécifiquement, l'émetteur est désormais https://accounts.google.com
, avec un schéma https
.
Lors du processus de migration, votre serveur doit valider le jeton d'identité de vos anciens et nouveaux clients Android. Pour vérifier les deux formats du jeton, apportez la modification qui correspond à la bibliothèque cliente que vous utilisez (le cas échéant):
- Java (bibliothèques clientes des API Google): passez à la version 1.21.0 ou ultérieure
- PHP (bibliothèques clientes des API Google): si vous utilisez la version 1.1.6 (ou une version ultérieure), effectuez la mise à niveau vers la version 2.0.0-RC1 (ou une version ultérieure).
- Node.js: mettre à niveau vers la version 0.9.7 ou ultérieure
- Python ou vos propres implémentations: acceptez les deux émetteurs suivants :
https://accounts.google.com
etaccounts.google.com
Effectuer une migration depuis le flux de code d'autorisation du serveur GoogleAuthUtil
Si vous utilisez GoogleAuthUtil
pour obtenir un code d'autorisation de serveur, vous devez migrer vers le nouveau flux de code d'autorisation de l'API Sign-In.
Par exemple, si votre code Android ressemble à l'exemple suivant, vous devez effectuer la migration:
Dans l'exemple, les requêtes de code d'autorisation du serveur utilisent oauth2:server:client_id
+ l'ID client de votre serveur Web comme paramètre scope
pour l'appel GoogleAuthUtil.getToken
(oauth2:server:client_id:9414861317621.apps.googleusercontent.com
).
Le nouveau flux avec code d'autorisation de l'API Sign-In présente les avantages suivants:
- Connexion simplifiée en un seul geste
- Si vous suivez le guide de migration ci-dessous, votre serveur peut obtenir un jeton d'ID contenant les informations du profil utilisateur lorsque vous effectuez l'échange de code d'autorisation.
Pour migrer vers le nouveau flux de code d'autorisation, effectuez les modifications suivantes:
Côté client Android
- Supprimer l'autorisation
GET_ACCOUNTS
(Contacts) si vous le demandez - Remplacez tout code utilisant
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
ouAccountManager.newChooseAccountIntent()
parAuth.GOOGLE_SIGN_IN_API
avec la configurationGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Côté serveur
Conservez votre code actuel, mais spécifiez https://oauth2.googleapis.com/token
comme point de terminaison du serveur de jetons lors de la création de l'objet GoogleAuthorizationCodeTokenRequest
. Vous pourrez ainsi obtenir un jeton d'ID contenant l'adresse e-mail, l'ID utilisateur et les informations de profil de l'utilisateur sans avoir besoin d'un autre appel réseau. Ce point de terminaison est entièrement rétrocompatible, et le code ci-dessous fonctionnera pour les codes d'authentification du serveur récupérés à la fois dans vos anciennes et nouvelles implémentations de client Android.
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( transport, jsonFactory, // Use below for tokenServerEncodedUrl parameter "https://oauth2.googleapis.com/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) .execute(); ... // You can also get an ID token from auth code exchange. GoogleIdToken googleIdToken = tokenResponse.parseIdToken(); GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory) .setAudience(Arrays.asList(SERVER_CLIENT_ID)) .setIssuer("https://accounts.google.com") .build(); // Refer to ID token documentation to see how to get data from idToken object. GoogleIdToken idToken = verifier.verify(idTokenString); ...