Guida alla migrazione del flusso fuori banda (OOB)

Panoramica

Il 16 febbraio 2022 abbiamo annunciato l'intenzione di rendere più sicure le interazioni Google OAuth tramite l'utilizzo di flussi OAuth più sicuri. Questa guida ti aiuta a comprendere le modifiche necessarie e i passaggi per eseguire correttamente la migrazione dal flusso OAuth out-of-band (OOB) alle alternative supportate.

Questa iniziativa è una misura di protezione dagli attacchi di phishing e di furto d'identità delle app durante le interazioni con gli endpoint di autorizzazione OAuth 2.0 di Google.

Che cos'è OOB?

OAuth out-of-band (OOB), anche noto come opzione di copia/incolla manuale, è un flusso legacy sviluppato per supportare i client nativi che non hanno un URI di reindirizzamento per accettare le credenziali dopo che un utente approva una richiesta di consenso OAuth. Il flusso OOB rappresenta un rischio di phishing remoto e i client devono eseguire la migrazione a un metodo alternativo per proteggerti da questa vulnerabilità.

Il flusso OOB verrà ritirato per tutti i tipi di client, ad esempio applicazioni web, Android, iOS, piattaforma Universal Windows (UWP), app di Chrome, TV e dispositivi con input limitato, app desktop.

Date di conformità principali

  • 28 febbraio 2022: nuovo utilizzo di OAuth bloccato per il flusso OOB
  • 5 settembre 2022: per le richieste OAuth non conformi potrebbe essere mostrato un messaggio di avviso rivolto agli utenti
  • 3 ottobre 2022: il flusso OOB è deprecato per i client OAuth creati prima del 28 febbraio 2022
  • 31 gennaio 2023: tutti i client esistenti sono bloccati (inclusi quelli esenti)

Per le richieste non conformi verrà mostrato un messaggio di errore rivolto agli utenti. Il messaggio comunicherà agli utenti che l'app è bloccata mentre visualizzi l'email di assistenza che hai registrato nella schermata di consenso OAuth nella console API di Google.

Il processo di migrazione è costituito da due passaggi principali:
  1. Determina se ti riguarda.
  2. Se il problema ti riguarda, esegui la migrazione a un'alternativa più sicura.

Determina se il problema ti riguarda

Questo ritiro è applicabile solo alle app di produzione, ovvero le app con lo stato di pubblicazione impostato su In produzione. Il flusso continuerà a funzionare per le app con lo stato di pubblicazione Test.

Controlla il tuo stato di pubblicazione nell'OAuth Consent Screen page di Google API Console e vai al passaggio successivo se utilizzi il flusso OOB in un progetto con stato di pubblicazione "In produzione".

Come determinare se la tua app utilizza il flusso OOB

Controlla il codice dell'app o la chiamata di rete in uscita (se l'app usa una libreria OAuth) per determinare se la richiesta di autorizzazione OAuth di Google effettuata dall'app utilizza un valore URI di reindirizzamento OOB.

Ispeziona il codice dell'applicazione

Esamina la sezione del codice dell'applicazione in cui effettui chiamate agli endpoint di autorizzazione OAuth di Google e determina se il parametro redirect_uri contiene uno dei seguenti valori:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Una richiesta di flusso di reindirizzamento OOB di esempio sarà simile a quella riportata di seguito:
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>

Ispeziona chiamata di rete in uscita

Il metodo di ispezione delle chiamate di rete varia a seconda del tipo di client dell'applicazione.
Durante l'ispezione delle chiamate di rete, cerca le richieste inviate agli endpoint di autorizzazione OAuth di Google e determina se il parametro redirect_uri contiene uno dei seguenti valori:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Una richiesta di flusso di reindirizzamento OOB di esempio sarà simile alla seguente:
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>

Esegui la migrazione a un'alternativa sicura

Client mobile (Android / iOS)

Se stabilisci che la tua app utilizza il flusso OOB con un tipo di client OAuth per Android o iOS, devi eseguire la migrazione utilizzando i nostri SDK mobile Accedi con Google (Android, iOS).

L'SDK semplifica l'accesso alle API di Google e gestisce tutte le chiamate agli endpoint di autorizzazione OAuth 2.0 di Google.

I link alla documentazione riportati di seguito forniscono informazioni su come utilizzare gli SDK Accedi con Google per accedere alle API di Google senza utilizzare un URI di reindirizzamento OOB.

Accedere alle API di Google su Android

Accesso lato server (offline)
L'esempio seguente mostra come accedere alle API di Google sul lato server su 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);
}

Consulta la guida all'accesso lato server per informazioni su come accedere alle API di Google dal lato server.

Accedi alle API di Google in un'app per iOS

Accesso lato client

L'esempio seguente mostra come accedere alle API di Google sul lato client su 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()
}

Utilizza il token di accesso per chiamare l'API, includendolo nell'intestazione di una richiesta REST o gRPC (Authorization: Bearer ACCESS_TOKEN) oppure utilizzando l'autore dell'autorizzazione fetcher (GTMFetcherAuthorizationProtocol) con la libreria client delle API di Google per Objective-C per REST.

Consulta la guida all'accesso lato client per informazioni su come accedere alle API di Google sul lato client. su come accedere alle API di Google sul lato client.

Accesso lato server (offline)
L'esempio seguente mostra come accedere alle API di Google sul lato server per supportare 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
}

Consulta la guida all'accesso lato server per informazioni su come accedere alle API di Google dal lato server.

Client app di Chrome

Se stabilisci che la tua app utilizza il flusso OOB sul client dell'app Chrome, devi eseguire la migrazione utilizzando l' API Chrome Identity.

L'esempio seguente mostra come recuperare tutti i contatti degli utenti senza utilizzare un URI di reindirizzamento 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)
    });
   });
 });
};

Consulta la guida all'API Chrome Identity per ulteriori informazioni su come accedere all'autenticazione degli utenti e a chiamare gli endpoint Google con l'API Chrome Identity.

Applicazione web

Se determini che la tua app utilizza il flusso OOB per un'applicazione web, devi eseguire la migrazione a una delle nostre librerie client dell'API di Google. Le librerie client per i diversi linguaggi di programmazione sono elencate qui.

Le librerie semplificano l'accesso alle API di Google e la gestione di tutte le chiamate agli endpoint Google.

Accesso lato server (offline)
Per utilizzare la modalità di accesso lato server (offline) devi:
  • Configura un server e definisci un endpoint accessibile pubblicamente (l'URI di reindirizzamento) per ricevere il codice di autorizzazione.
  • Configura l' URI di reindirizzamento nella Credentials page Google API Console

Lo snippet di codice riportato di seguito mostra un esempio NodeJS dell'utilizzo dell'API Google Drive per elencare i file Google Drive di un utente sul lato server senza utilizzare un URI di reindirizzamento 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.
      });
    }
  }
}

Consulta la guida alle app web lato server per informazioni su come accedere alle API di Google dal lato server.

Accesso lato client

Lo snippet di codice riportato di seguito, in JavaScript, mostra un esempio di utilizzo dell'API Google per accedere agli eventi del calendario dell'utente sul lato 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(...);
}

Consulta la guida alle app web lato client per scoprire come accedere alle API di Google dal lato client.

Client desktop

Se determini che la tua app utilizza il flusso OOB su un client desktop, devi eseguire la migrazione utilizzando il flusso degli indirizzi IP di loopback (localhost o 127.0.0.1).