Se in passato hai eseguito l'integrazione con Accedi con Google utilizzando GoogleAuthUtil.getToken
o Plus.API
, dovresti eseguire la migrazione all'API Sign-In più recente per una maggiore sicurezza e un'esperienza utente migliore.
Esegui la migrazione dall'anti-pattern del token di accesso
Non devi inviare al tuo server di backend i token di accesso ottenuti con GoogleAuthUtil.getToken
sotto forma di asserzione di identità, poiché non puoi verificare facilmente che il token sia stato inviato al backend, il che ti rende vulnerabile all'inserimento di un token di accesso da parte di un utente malintenzionato.
Ad esempio, se il codice Android è simile all'esempio seguente, devi eseguire la migrazione dell'app alle best practice attuali.
Nell'esempio, le richieste di token di accesso utilizzano oauth2:
e una stringa di ambito come parametro scope
per la chiamata GoogleAuthUtil.getToken
(oauth2:https://www.googleapis.com/auth/plus.login
).
Anziché eseguire l'autenticazione con un token di accesso acquisito con GoogleAuthUtil.getToken
, utilizza il flusso del token ID o il flusso del codice di autenticazione.
Esegui la migrazione al flusso del token ID
Se tutto ciò che ti serve è l'URL dell'ID, dell'indirizzo email, del nome o dell'immagine del profilo dell'utente, utilizza il flusso del token ID.
Per eseguire la migrazione al flusso del token ID, apporta le seguenti modifiche:
Lato client Android
- Rimuovi l'autorizzazione
GET_ACCOUNTS
(Contatti) se la richiedi - Cambia qualsiasi codice utilizzando
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configurazione diGoogleSignInOptions.Builder.requestIdToken(...)
.
Lato server
- Crea un nuovo endpoint per l'autenticazione del token ID
- Disattiva l'endpoint precedente dopo la migrazione delle app client
Esegui la migrazione al flusso del codice di autorizzazione del server
Se il tuo server deve accedere ad altre API di Google, come Google Drive, YouTube o Contatti, utilizza il flusso del codice di autorizzazione del server.
Per eseguire la migrazione al flusso del codice di autorizzazione del server, apporta le seguenti modifiche:
Lato client Android
- Rimuovi l'autorizzazione
GET_ACCOUNTS
(Contatti) se la richiedi - Cambia qualsiasi codice utilizzando
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configurazione diGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Lato server
- Crea un nuovo endpoint per il flusso del codice di autorizzazione del server
- Disattiva l'endpoint precedente dopo la migrazione delle app client
Puoi comunque condividere la logica di accesso alle API tra gli endpoint vecchio e nuovo. Ad esempio:
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); }
Eseguire la migrazione dal flusso di token dell'ID GoogleAuthUtil
Se utilizzi GoogleAuthUtil
per ottenere i token ID, devi eseguire la migrazione al nuovo flusso di token ID dell'API Sign-In.
Ad esempio, se il codice Android è simile al seguente, dovresti eseguire la migrazione:
Nell'esempio, le richieste di token ID utilizzano audience:server:client_id
più
l'ID client del server web come parametro di "ambito" per la
chiamata
GoogleAuthUtil.getToken
(audience:server:client_id:9414861317621.apps.googleusercontent.com
).
Il nuovo flusso di token dell'ID dell'API Sign-In offre i seguenti vantaggi:
- Esperienza di accesso semplificata con un tocco
- Il tuo server può ricevere informazioni del profilo utente senza una chiamata di rete aggiuntiva
Per eseguire la migrazione al flusso del token ID, apporta le seguenti modifiche:
Lato client Android
- Rimuovi l'autorizzazione
GET_ACCOUNTS
(Contatti) se la richiedi - Cambia qualsiasi codice utilizzando
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configurazione diGoogleSignInOptions.Builder.requestIdToken(...)
.
Lato server
La nuova API di accesso rilascia token ID conformi alla specifica OpenID Connect, a differenza di GoogleAuthUtil.getToken
, che utilizza un formato deprecato.
In particolare, l'emittente è ora https://accounts.google.com
, con uno schema https
.
Durante il processo di migrazione, il server deve verificare il token ID dei client Android precedenti e nuovi. Per verificare entrambi i formati del token, apporta la modifica corrispondente alla libreria client che utilizzi (se ne utilizzi una):
- Java (librerie client delle API di Google): esegui l'upgrade alla versione 1.21.0 o successiva
- PHP (librerie client delle API di Google): se utilizzi la versione v1, esegui l'upgrade alla versione 1.1.6 o successiva; se utilizzi la versione 2, esegui l'upgrade alla versione 2.0.0-RC1 o successiva
- Node.js: esegui l'upgrade alla versione 0.9.7 o successiva
- Python o le tue implementazioni: accetta entrambi gli emittenti:
https://accounts.google.com
eaccounts.google.com
Migrazione dal flusso del codice di autorizzazione del server GoogleAuthUtil
Se utilizzi GoogleAuthUtil
per ricevere un codice di autorizzazione del server, devi eseguire la migrazione al
nuovo flusso del codice di autorizzazione dell'API Sign-In.
Ad esempio, se il codice Android è simile al seguente, dovresti eseguire la migrazione:
Nell'esempio, le richieste del codice di autorizzazione del server utilizzano oauth2:server:client_id
+
l'ID client del server web come parametro scope
per la
chiamata
GoogleAuthUtil.getToken
(oauth2:server:client_id:9414861317621.apps.googleusercontent.com
).
Il nuovo flusso del codice di autorizzazione dell'API Sign-In offre i seguenti vantaggi:
- Esperienza di accesso semplificata con un tocco
- Se segui la guida alla migrazione riportata di seguito, il tuo server può ricevere un token ID contenente le informazioni del profilo dell'utente quando esegui lo scambio del codice di autorizzazione
Per eseguire la migrazione al nuovo flusso del codice di autorizzazione, apporta le seguenti modifiche:
Lato client Android
- Rimuovi l'autorizzazione
GET_ACCOUNTS
(Contatti) se la richiedi - Cambia qualsiasi codice utilizzando
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configurazione diGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Lato server
Mantieni il codice corrente, ma specifica https://oauth2.googleapis.com/token
come endpoint del server dei token durante la creazione dell'oggetto GoogleAuthorizationCodeTokenRequest
, in modo da poter ricevere un token ID con le informazioni sull'indirizzo email, sull'ID utente e sul profilo dell'utente senza bisogno di un'altra chiamata di rete. Questo endpoint è completamente compatibile con le versioni precedenti e il codice riportato di seguito funziona per i codici di autenticazione del server recuperati dalle implementazioni client Android precedente e nuovo.
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); ...