Effectuer une migration depuis GoogleAuthUtil et Plus.API

Si vous avez déjà intégré Google Sign-In par le passé à l'aide de GoogleAuthUtil.getToken ou de Plus.API, nous vous recommandons de migrer vers la dernière API Sign-In pour plus de sécurité et une meilleure expérience utilisateur.

Migrer à partir de l'anti-modèle de jeton d'accès

Vous ne devez pas envoyer de jetons d'accès obtenus avec GoogleAuthUtil.getToken à votre serveur backend en tant qu'assertion d'identité, car vous ne pouvez pas vérifier facilement que le jeton a été émis pour votre backend, ce qui vous rend vulnérable à l'insertion d'un jeton d'accès provenant d'un pirate informatique.

Par exemple, si votre code Android ressemble à l'exemple ci-dessous, vous devez migrer votre application en appliquant les bonnes pratiques actuelles.

Code Android

Dans l'exemple, les requêtes de jeton d'accès utilisent oauth2: plus 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 jetons d'ID ou le flux de code d'autorisation.

Migrer vers le flux de jetons d'ID

Si vous n'avez besoin que de l'ID de l'utilisateur, de son adresse e-mail, de son nom ou de l'URL de sa photo de profil, utilisez le flux de jetons d'ID.

Pour migrer vers le flux de jetons d'ID, apportez les modifications suivantes:

Android côté client

  • 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ésactiver l'ancien point de terminaison après la migration de vos applications clientes

Migrer vers le flux de 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 de code d'autorisation du serveur, apportez les modifications suivantes:

Android côté client

  • 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 migrer vers le nouveau flux de jetons d'ID de l'API Sign-In.

Par exemple, si votre code Android ressemble à l'exemple suivant, vous devez migrer:

Code Android

Dans l'exemple, les requêtes de jeton d'ID utilisent audience:server:client_id plus l'ID client de votre serveur Web comme paramètre de "champ d'application" 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:

  • Connexion simplifiée d'un simple geste
  • Votre serveur peut obtenir des informations de profil utilisateur sans appel réseau supplémentaire

Pour migrer vers le flux de jetons d'ID, apportez les modifications suivantes:

Android côté client

  • 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 émet des jetons d'ID 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.

Au cours du processus de migration, votre serveur doit vérifier le jeton d'ID de vos anciens et nouveaux clients Android. Pour vérifier les deux formats du jeton, apportez la modification correspondant à la bibliothèque cliente que vous utilisez (le cas échéant):

  • Java (bibliothèques clientes des API Google): mise à niveau vers la version 1.21.0 ou ultérieure
  • PHP (bibliothèques clientes des API Google): si vous utilisez la version 1, passez à la version 1.1.6 ou ultérieure ; si vous utilisez la version 2, passez à la version 2.0.0-RC1 ou ultérieure.
  • Node.js: passez à 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 à partir du 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 migrer:

Code Android

Dans cet 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 de code d'autorisation de l'API Sign-In présente les avantages suivants:

  • Connexion simplifiée d'un simple geste
  • Si vous suivez le guide de migration ci-dessous, votre serveur peut obtenir un jeton d'ID contenant les informations de profil utilisateur lors de l'échange du code d'autorisation.

Pour migrer vers le nouveau flux de code d'autorisation, apportez les modifications suivantes:

Android côté client

  • 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 lorsque vous créez l'objet GoogleAuthorizationCodeTokenRequest. Vous pourrez ainsi obtenir un jeton d'ID avec 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 de serveur récupérés à partir de 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);
...