Guide de migration du flux externe (OOB)

Présentation

Le 16 février 2022, nous avons annoncé notre intention de renforcer la sécurité des interactions OAuth avec Google en utilisant des flux OAuth plus sécurisés. Ce guide vous explique les modifications nécessaires et les étapes à suivre pour passer du flux OAuth hors bande (OOB) à des alternatives compatibles.

Cette initiative constitue une mesure de protection contre les attaques par hameçonnage et par usurpation d'identité d'applications lors des interactions avec les points de terminaison d'autorisation OAuth 2.0 de Google.

Qu'est-ce que la publicité extérieure en ligne ?

Une fois qu'un utilisateur a approuvé une demande de consentement OAuth, il s'agit d'un ancien flux développé pour prendre en charge les clients natifs qui n'ont pas d'URI de redirection et qui n'ont pas d'URI de redirection pour accepter les identifiants OAuth en hors bande (OOB) OAuth, également appelée option de copier-coller manuel. Le flux OOB présente un risque d'hameçonnage à distance, et les clients doivent migrer vers une autre méthode pour se protéger contre cette faille.

Le flux OOB sera bientôt abandonné pour tous les types de clients, c'est-à-dire les applications Web, Android, iOS, la plate-forme Windows universelle (UWP), les applications Chrome, les téléviseurs, les appareils à saisie limitée et les applications de bureau.

Principales dates de conformité

  • 28 février 2022 : nouvelle utilisation d'OAuth bloquée pour le flux OOB
  • 5 septembre 2022 : un message d'avertissement visible par l'utilisateur peut s'afficher dans les requêtes OAuth non conformes
  • 3 octobre 2022 : le flux OOB est obsolète pour les clients OAuth créés avant le 28 février 2022.
  • 31 janvier 2023 : tous les clients existants sont bloqués (y compris les clients exemptés)

Un message d'erreur visible par l'utilisateur s'affiche pour les requêtes non conformes. Le message indiquera aux utilisateurs que l'application est bloquée et affichera l'adresse e-mail d'assistance que vous avez enregistrée dans l'écran de consentement OAuth dans la console Google APIs.

Le processus de migration comporte deux étapes principales :
  1. Déterminez si vous êtes concerné.
  2. Si vous êtes concerné, optez pour une alternative plus sécurisée.

Déterminez si vous êtes concerné.

Cet abandon ne s'applique qu'aux applications de production (c'est-à-dire aux applications dont l'état de publication est défini sur En production). Le flux continuera de fonctionner pour les applications dont l' état de publication de test est défini.

Vérifiez l'état de la publication dans le Consent Screen pageOAuth de Google API Console et passez à l'étape suivante si vous utilisez le flux OOB dans un projet dont l'état de publication est "En production".

Déterminer si votre application utilise le flux OOB

Inspectez le code de votre application ou l'appel réseau sortant (si votre application utilise une bibliothèque OAuth) pour déterminer si la requête d'autorisation Google OAuth de votre application utilise une valeur d'URI de redirection OOB.

Inspecter le code de votre application

Examinez la section du code de votre application dans laquelle vous appelez les points de terminaison d'autorisation Google OAuth, et déterminez si le paramètre redirect_uri comporte l'une des valeurs suivantes :
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Vous trouverez ci-dessous un exemple de requête de flux de redirection OOB :
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Inspecter l'appel réseau sortant

La méthode d'inspection des appels réseau varie en fonction du type de client de votre application.
Lors de l'inspection des appels réseau, recherchez les requêtes envoyées aux points de terminaison d'autorisation Google OAuth et déterminez si le paramètre redirect_uri comporte l'une des valeurs suivantes :
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Voici un exemple de requête de flux de redirection OOB :
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Adoptez une alternative sécurisée

Clients mobiles (Android / iOS)

Si vous déterminez que votre application utilise le flux OOB avec un type de client OAuth Android ou iOS, nous vous recommandons d'utiliser nos SDK Google Sign-In pour mobile (Android, iOS).

Ce SDK facilite l'accès aux API Google et gère tous les appels aux points de terminaison d'autorisation OAuth 2.0 de Google.

Les liens vers la documentation ci-dessous fournissent des informations sur l'utilisation des SDK Google Sign-In pour accéder aux API Google sans utiliser d'URI de redirection OOB.

Accéder aux API Google sur Android

Accès côté serveur (hors connexion)
L'exemple ci-dessous montre comment accéder aux API Google côté serveur sur Android.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
  GoogleSignInAccount account = task.getResult(ApiException.class);
  
  // request a one-time authorization code that your server exchanges for an
  // access token and sometimes refresh token
  String authCode = account.getServerAuthCode();
  
  // Show signed-in UI
  updateUI(account);

  // TODO(developer): send code to server and exchange for access/refresh/ID tokens
} catch (ApiException e) {
  Log.w(TAG, "Sign-in failed", e);
  updateUI(null);
}

Consultez le guide d'accès côté serveur pour découvrir comment accéder aux API Google côté serveur.

Accéder aux API Google dans une application iOS

Accès côté client

L'exemple ci-dessous montre comment accéder aux API Google côté client sur iOS.

user.authentication.do { authentication, error in
  guard error == nil else { return }
  guard let authentication = authentication else { return }
  
  // Get the access token to attach it to a REST or gRPC request.
  let accessToken = authentication.accessToken
  
  // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
  // use with GTMAppAuth and the Google APIs client library.
  let authorizer = authentication.fetcherAuthorizer()
}

Utilisez le jeton d'accès pour appeler l'API, soit en l'incluant dans l'en-tête d'une requête REST ou gRPC (Authorization: Bearer ACCESS_TOKEN), soit en utilisant l'agent d'autorisation d'extraction (GTMFetcherAuthorizationProtocol) avec la bibliothèque cliente des API Google pour Goal-C pour REST.

Consultez le guide de l'accès côté client pour découvrir comment accéder aux API Google côté client. sur la façon d'accéder aux API Google côté client.

Accès côté serveur (hors connexion)
L'exemple ci-dessous montre comment accéder aux API Google côté serveur pour prendre en charge un client iOS.
GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
  guard error == nil else { return }
  guard let user = user else { return }
  
  // request a one-time authorization code that your server exchanges for
  // an access token and refresh token
  let authCode = user.serverAuthCode
}

Consultez le guide d'accès côté serveur pour découvrir comment accéder aux API Google côté serveur.

Client d'application Chrome

Si vous déterminez que votre application utilise le flux OOB sur le client de l'application Chrome, vous devez migrer vers l' API Chrome Identity.

L'exemple ci-dessous montre comment obtenir tous les contacts d'un utilisateur sans utiliser d'URI de redirection OOB.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {

  
  // retrieve access token
  chrome.identity.getAuthToken({interactive: true}, function(token) {
  
  // ..........


  // the example below shows how to use a retrieved access token with an appropriate scope
  // to call the Google People API contactGroups.get endpoint

  fetch(
    'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
    init)
    .then((response) => response.json())
    .then(function(data) {
      console.log(data)
    });
   });
 });
};

Consultez le guide de l'API Chrome Identity pour en savoir plus sur la façon d'accéder à l'authentification des utilisateurs et d'appeler les points de terminaison Google avec l'API Chrome Identity.

Application Web

Si vous déterminez que votre application utilise le flux OOB pour une application Web, vous devez migrer vers l'une de nos bibliothèques clientes pour les API Google. Consultez la liste des bibliothèques clientes pour les différents langages de programmation sur cette page.

Les bibliothèques facilitent l'accès aux API Google et la gestion de tous les appels vers les points de terminaison Google.

Accès côté serveur (hors connexion)
Avec le mode d'accès côté serveur (hors connexion) :
  • Mettez en place un serveur et définissez un point de terminaison accessible au public (l'URI de redirection) pour recevoir le code d'autorisation.
  • Configurez l' URI de redirection dans le Credentials page du Google API Console

L'extrait de code ci-dessous montre un exemple NodeJS d'utilisation de l'API Google Drive pour répertorier les fichiers Google Drive d'un utilisateur côté serveur sans utiliser d'URI de redirection OOB.

async function main() {
  const server = http.createServer(async function (req, res) {

  if (req.url.startsWith('/oauth2callback')) {
    let q = url.parse(req.url, true).query;

    if (q.error) {
      console.log('Error:' + q.error);
    } else {
      
      // Get access and refresh tokens (if access_type is offline)
      let { tokens } = await oauth2Client.getToken(q.code);
      oauth2Client.setCredentials(tokens);

      // Example of using Google Drive API to list filenames in user's Drive.
      const drive = google.drive('v3');
      drive.files.list({
        auth: oauth2Client,
        pageSize: 10,
        fields: 'nextPageToken, files(id, name)',
      }, (err1, res1) => {
        // TODO(developer): Handle response / error.
      });
    }
  }
}

Consultez le guide sur les applications Web côté serveur pour découvrir comment accéder aux API Google côté serveur.

Accès côté client

L'extrait de code ci-dessous, en JavaScript, montre comment utiliser l'API Google pour accéder aux événements d'agenda d'un utilisateur côté client.


// initTokenClient() initializes a new token client with your
// web app's client ID and the scope you need access to

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  
  // callback function to handle the token response
  callback: (tokenResponse) => {
    if (tokenResponse && tokenResponse.access_token) { 
      gapi.client.setApiKey('YOUR_API_KEY');
      gapi.client.load('calendar', 'v3', listUpcomingEvents);
    }
  },
});

function listUpcomingEvents() {
  gapi.client.calendar.events.list(...);
}

Consultez le guide des applications Web côté client pour savoir comment accéder aux API Google côté client.

Client de bureau

Si vous déterminez que votre application utilise le flux OOB sur un client de bureau, vous devez migrer vers le flux d'adresse IP de rebouclage (localhost ou 127.0.0.1).