Effectuer une migration depuis GoogleAuthUtil et Plus.API

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.

Code Android

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() ou AccountManager.newChooseAccountIntent() par Auth.GOOGLE_SIGN_IN_API avec la configuration GoogleSignInOptions.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() ou AccountManager.newChooseAccountIntent() par Auth.GOOGLE_SIGN_IN_API avec la configuration GoogleSignInOptions.Builder.requestServerAuthCode(...).

Côté serveur

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:

Code Android

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() ou AccountManager.newChooseAccountIntent() par Auth.GOOGLE_SIGN_IN_API avec la configuration GoogleSignInOptions.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 et accounts.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:

Code Android

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() ou AccountManager.newChooseAccountIntent() par Auth.GOOGLE_SIGN_IN_API avec la configuration GoogleSignInOptions.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);
...