Se in passato hai eseguito l'integrazione con Accedi con Google utilizzando
GoogleAuthUtil.getToken
o Plus.API
, devi eseguire la migrazione alla versione più recente
API di accesso per una maggiore sicurezza e una migliore esperienza utente.
Esegui la migrazione dall'anti-pattern dei token di accesso
Non devi inviare i token di accesso ottenuti con GoogleAuthUtil.getToken
a
server di backend come asserzione dell'identità, in quanto non è facile
che il token sia stato inviato al tuo backend, il che ti rende vulnerabile all'inserimento
di un token di accesso di un utente malintenzionato.
Ad esempio, se il tuo codice Android è simile all'esempio riportato di seguito, eseguire la migrazione della tua 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
).
Invece di eseguire l'autenticazione con un token di accesso acquisito con
GoogleAuthUtil.getToken
, utilizza il flusso del token ID o quello del codice di autorizzazione.
Esegui la migrazione al flusso dei token ID
Se tutto ciò di cui hai bisogno è l'ID, l'indirizzo email, il nome o l'URL dell'immagine del profilo dell'utente, utilizza il flusso dei token ID.
Per eseguire la migrazione al flusso dei 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()
, oppure DaAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con ConfigurazioneGoogleSignInOptions.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 server ha bisogno di accedere ad altre API di Google, come Google Drive, YouTube o Contatti, utilizza il flusso del codice di autenticazione 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()
, oppure DaAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con ConfigurazioneGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Lato server
- Crea un nuovo endpoint per il flusso del codice di autenticazione del server
- Disattiva l'endpoint precedente dopo la migrazione delle app client
Puoi comunque condividere la logica di accesso alle API tra gli endpoint vecchi e nuovi. 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); }
Esegui la migrazione dal flusso di token ID GoogleAuthUtil
Se utilizzi GoogleAuthUtil
per ricevere token ID, devi eseguire la migrazione al nuovo
Flusso di token ID dell'API di accesso.
Ad esempio, se il tuo codice Android è simile all'esempio seguente, dovresti migrate:
Nell'esempio, le richieste di token ID utilizzano audience:server:client_id
più il parametro
l'ID client per il tuo server web come parametro "scope" per
GoogleAuthUtil.getToken
chiamata
(audience:server:client_id:9414861317621.apps.googleusercontent.com
).
Il nuovo flusso di token dell'ID dell'API Sign-In offre i seguenti vantaggi:
- Accesso semplificato con un solo tocco
- Il server può ricevere le informazioni del profilo utente senza effettuare chiamate di rete aggiuntive.
Per eseguire la migrazione al flusso dei 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()
, oppure DaAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con ConfigurazioneGoogleSignInOptions.Builder.requestIdToken(...)
.
Lato server
La nuova API Sign-In emette token ID conformi a OpenID Connect
specifica, a differenza di GoogleAuthUtil.getToken
, che utilizza un formato deprecato.
In particolare, l'emittente è ora https://accounts.google.com
, con un https
.
Durante il processo di migrazione, il server deve verificare il token ID di entrambi i tuoi client Android nuovi e vecchi. Per verificare entrambi i formati del token, esegui la che corrisponde 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 1, esegui l'upgrade alla versione 1.1.6 o successiva; se utilizzi la versione v2, esegui l'upgrade alla versione 2.0.0-RC1 o successiva
- Node.js: upgrade a 0.9.7 o versioni successive
- Python o implementazioni personali: accetta entrambi questi emittenti:
https://accounts.google.com
eaccounts.google.com
Esegui la migrazione dal flusso del codice di autorizzazione del server GoogleAuthUtil
Se utilizzi GoogleAuthUtil
per ricevere un codice di autenticazione del server, devi eseguire la migrazione al
nuovo flusso del codice di autorizzazione dell'API Sign-In.
Ad esempio, se il tuo codice Android è simile all'esempio seguente, dovresti migrate:
Nell'esempio, le richieste del codice di autorizzazione del server utilizzano oauth2:server:client_id
+ il
l'ID client per il server web come parametro scope
per
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:
- Accesso semplificato con un solo 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 effettui 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()
, oppure DaAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con ConfigurazioneGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Lato server
Mantieni il tuo codice corrente, ma specifica https://oauth2.googleapis.com/token
come endpoint del server token durante la creazione
GoogleAuthorizationCodeTokenRequest
, per poter ottenere un token ID
con l'indirizzo email, l'ID utente e le informazioni del profilo dell'utente senza bisogno di altri
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 dal vecchio e dal nuovo Android
implementazioni del cliente.
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); ...