Panoramica
Il 16 febbraio 2022 abbiamo annunciato i piani per rendere più sicure le interazioni OAuth di Google utilizzando flussi OAuth più sicuri. Questa guida ti aiuta a comprendere le modifiche necessarie e i passaggi per eseguire la migrazione dal flusso dell'indirizzo IP loopback alle alternative supportate.
Questo sforzo è una misura protettiva contro gli attacchi di phishing e impersonificazione di app durante le interazioni con gli endpoint di autorizzazione OAuth 2.0 di Google.
Che cos'è il flusso dell'indirizzo IP loopback?
Il flusso dell'indirizzo IP di loopback supporta l'utilizzo di un indirizzo IP di loopback olocalhost
come componente host dell'URI di reindirizzamento a cui
vengono inviate le credenziali dopo che un utente approva una richiesta di consenso OAuth. Questo flusso è
vulnerabile agli
attacchi man in the middle
in cui un'app malintenzionata, che accede alla stessa interfaccia di loopback su alcuni
sistemi operativi, può intercettare la risposta dal server di autorizzazione all'URI di reindirizzamento
specificato e ottenere l'accesso al codice di autorizzazione.
Il flusso di indirizzi IP di loopback verrà ritirato per i tipi di client OAuth nativi di iOS, Android e Chrome, ma continuerà a essere supportato nelle app per computer.
Date chiave per la conformità
- 14 marzo 2022: i nuovi client OAuth non possono utilizzare il flusso di indirizzi IP di loopback
- 1° agosto 2022: un messaggio di avviso rivolto agli utenti potrebbe essere visualizzato per le richieste OAuth non conformi
- 31 agosto 2022: il flusso dell'indirizzo IP di loopback è bloccato per i client OAuth nativi di Android, delle app Chrome e di iOS creati prima del 14 marzo 2022
- 21 ottobre 2022: tutti i clienti esistenti sono bloccati (inclusi i clienti esenti)
Per le richieste non conformi verrà visualizzato un messaggio di errore rivolto agli utenti. Il messaggio comunicherà agli utenti che l'app è bloccata e mostrerà l'email di assistenza che hai registrato nella schermata per il consenso OAuth nella console API di Google.
- Determinare se sei interessato.
- Se il tuo account è interessato, esegui la migrazione a un'alternativa supportata.
Determinare se sei interessato
Controlla il tipo di ID client OAuth
Vai alla Clients page del Google Cloud Console e visualizza il tipo di ID client OAuth nella sezione ID client OAuth 2.0. Sarà una delle seguenti: applicazione web, Android, iOS, Universal Windows Platform (UWP), app Chrome, TV e dispositivi di input limitati, app desktop.
Procedi al passaggio successivo se il tipo di client è Android, app Chrome o iOS e utilizzi il flusso dell'indirizzo IP di loopback.
Se utilizzi il flusso dell'indirizzo IP di loopback su un client OAuth per app desktop, non devi fare nulla in merito a questo ritiro, in quanto l'utilizzo con questo tipo di client OAuth continuerà a essere supportato.
Come determinare se la tua app utilizza il flusso di indirizzi IP di loopback
Ispeziona il codice dell'app o la chiamata di rete in uscita (nel caso in cui l'app utilizzi una libreria OAuth) per determinare se la richiesta di autorizzazione OAuth di Google effettuata dall'app utilizza valori URI di reindirizzamento loopback.
Ispezionare il codice dell'applicazione
redirect_uri
ha uno dei
seguenti valori:
-
redirect_uri=http://127.0.0.1:<port>
ad es.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
ad es.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
ad es.redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Ispezionare la chiamata di rete in uscita
- Applicazione web - esamina l'attività di rete su Chrome
- Android - ispeziona il traffico di rete con Network Inspector
-
App Chrome
- Vai alla pagina delle estensioni di Chrome.
- Seleziona la casella di controllo Modalità sviluppatore nell'angolo in alto a destra della pagina delle estensioni.
- Seleziona l'estensione che vuoi monitorare
- Fai clic sul link pagina di sfondo nella sezione Ispeziona visualizzazioni della pagina dell'estensione.
- Si aprirà un popup Strumenti per sviluppatori in cui potrai monitorare il traffico di rete nella scheda Rete
- iOS - Analisi del traffico HTTP con Instruments
- Universal Windows Platform (UWP) - Inspect network traffic in Visual Studio
- App desktop - utilizza uno strumento di acquisizione di rete disponibile per il sistema operativo per cui è stata sviluppata l'app
redirect_uri
ha uno dei
seguenti valori:
-
redirect_uri=http://127.0.0.1:<port>
ad es.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
ad es.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
ad es.redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Esegui la migrazione a un'alternativa supportata
Client mobile (Android / iOS)
Se determini che la tua app utilizza il flusso dell'indirizzo IP di loopback con un tipo di client OAuth Android o iOS, devi eseguire la migrazione all'utilizzo degli SDK consigliati (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 consigliati per accedere alle API di Google senza utilizzare un URI di reindirizzamento dell'indirizzo IP loopback.
Accedere alle API di Google su Android
Accesso lato client
L'esempio seguente mostra come accedere alle API di Google sul lato client su Android utilizzando la libreria Android dei servizi di identità Google consigliata.
ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { // Access already granted, continue with user action saveToDriveAppFolder(authorizationResult); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Passa authorizationResult
al metodo definito per salvare i contenuti nella cartella
Drive dell'utente. authorizationResult
ha il metodo
getAccessToken()
che restituisce il token di accesso.
Accesso lato server (offline)
L'esempio seguente mostra come accedere alle API di Google sul lato server su Android.ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder() .requestOfflineAccess(webClientId) .setRequestedScopes(requestedScopes) .build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { String authCode = authorizationResult.getServerAuthCode(); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
authorizationResult
ha il metodo
getServerAuthCode()
che restituisce il codice di autorizzazione che puoi inviare al backend per ottenere un token di accesso e di aggiornamento.
Accedere alle API di Google in un'app per iOS
Accesso lato client
L'esempio seguente mostra come accedere alle API di Google 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
) o utilizzando l'autorizzatore fetcher (GTMFetcherAuthorizationProtocol
) con la
libreria client delle API di Google per Objective-C per REST.
Consulta la guida all'accesso lato client per scoprire come accedere alle API di Google lato client. su come accedere alle API di Google lato client.
Accesso lato server (offline)
L'esempio seguente mostra come accedere alle API di Google 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 su come accedere alle API di Google dal lato server.
Client app di Chrome
Se determini che la tua app utilizza il flusso dell'indirizzo IP di loopback sul client dell'app Chrome, devi eseguire la migrazione all'utilizzo dell' API Chrome Identity.
L'esempio seguente mostra come ottenere tutti i contatti utente senza utilizzare un URI di reindirizzamento dell'indirizzo IP di loopback.
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 saperne di più su come accedere agli utenti autenticati e chiamare gli endpoint Google con l'API Chrome Identity.