Esegui la migrazione da GoogleAuthUtil e Plus.API

Se in passato hai eseguito l'integrazione con Accedi con Google utilizzando GoogleAuthUtil.getToken o Plus.API, devi eseguire la migrazione all'API Accedi con Google più recente per una maggiore sicurezza e un'esperienza utente migliore.

Eseguire la migrazione dall'antipattern del token di accesso

Non devi inviare i token di accesso ottenuti con GoogleAuthUtil.getToken al tuo server di backend come affermazione dell'identità, poiché non puoi verificare facilmente che il token sia stato emesso per il tuo backend, il che ti rende vulnerabile all'inserimento di un token di accesso da parte di un malintenzionato.

Ad esempio, se il codice Android è simile a quello riportato di seguito, devi eseguire la migrazione dell'app alle best practice attuali.

Codice Android

Nell'esempio, le richieste di token di accesso utilizzano oauth2: più una stringa di ambito come parametro scope per la chiamata GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

Anziché autenticarti 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 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 del token ID.

Per eseguire la migrazione al flusso dei token ID, apporta le seguenti modifiche:

Lato client Android

  • Rimuovere l'autorizzazione GET_ACCOUNTS (Contatti) se lo richiedi
  • Passa qualsiasi codice che utilizza GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configurazione GoogleSignInOptions.Builder.requestIdToken(...).

Lato server

Esegui la migrazione al flusso del codice di autorizzazione del server

Se il server deve accedere ad altre API di Google, come Google Drive, YouTube o Contatti, utilizza il flusso di codice di autenticazione del server.

Per eseguire la migrazione al flusso del codice di autenticazione del server, apporta le seguenti modifiche:

Lato client Android

  • Rimuovere l'autorizzazione GET_ACCOUNTS (Contatti) se lo richiedi
  • Passa qualsiasi codice che utilizza GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configurazione GoogleSignInOptions.Builder.requestServerAuthCode(...).

Lato server

Puoi comunque condividere la logica di accesso all'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 ottenere token ID, devi eseguire la migrazione al nuovo flusso di token ID dell'API Sign-In.

Ad esempio, se il codice Android è simile all'esempio seguente, devi eseguire la migrazione:

Codice Android

Nell'esempio, le richieste di token ID utilizzano audience:server:client_id più l'ID client per il tuo server web come parametro "scope" per la chiamata GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Il nuovo flusso di token ID dell'API Sign-In offre i seguenti vantaggi:

  • Esperienza di accesso semplificata 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 di token ID, apporta le seguenti modifiche:

Lato client Android

  • Rimuovere l'autorizzazione GET_ACCOUNTS (Contatti) se lo richiedi
  • Passa qualsiasi codice che utilizza GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configurazione GoogleSignInOptions.Builder.requestIdToken(...).

Lato server

La nuova API di accesso emette 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 la procedura di migrazione, il server deve verificare il token ID sia del vecchio che del nuovo client Android. 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 1, 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: upgrade a 0.9.7 o versioni successive
  • Python o le tue implementazioni: accetta entrambi questi emittenti: https://accounts.google.com e accounts.google.com

Eseguire la migrazione dal flusso del codice di autenticazione del server GoogleAuthUtil

Se utilizzi GoogleAuthUtil per ottenere un codice di autenticazione del server, devi eseguire la migrazione al flusso del codice di autenticazione della nuova API Accesso.

Ad esempio, se il codice Android è simile all'esempio seguente, devi eseguire la migrazione:

Codice Android

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 autenticazione 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ò ottenere 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 di codice di autenticazione, apporta le seguenti modifiche:

Lato client Android

  • Rimuovere l'autorizzazione GET_ACCOUNTS (Contatti) se lo richiedi
  • Passa qualsiasi codice che utilizza GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configurazione GoogleSignInOptions.Builder.requestServerAuthCode(...).

Lato server

Mantieni il codice attuale, ma specifica https://oauth2.googleapis.com/token come endpoint del server di token durante la creazione dell'oggetto GoogleAuthorizationCodeTokenRequest, in modo da poter ottenere un token ID con l'email, l'ID utente e le informazioni del profilo dell'utente senza dover effettuare un'altra chiamata di rete. Questo endpoint è completamente compatibile con le versioni precedenti e il codice riportato di seguito funzionerà per i codici di autorizzazione del server recuperati sia dalle implementazioni del client Android precedenti che da quelle nuove.

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);
...