Utilizzo del modello di token

La libreria JavaScript google.accounts.oauth2 ti consente di richiedere all'utente il consenso e ottenere un token di accesso per lavorare con i dati utente. Si basa sul Flusso di concessione implicita OAuth 2.0 e progettato per consentirti di chiamare Google le API direttamente utilizzando REST e CORS o la nostra libreria client delle API di Google per JavaScript (noto anche come gapi.client) per un accesso semplice e flessibile alle nostre più complesse.

Prima di accedere ai dati utente protetti da un browser, gli utenti sul tuo sito vengono attivati Le procedure di selezione dell'account, accesso e consenso di Google basate sul web e infine I server OAuth di Google emettono e restituiscono un token di accesso alla tua app web.

Nel modello di autorizzazione basata su token, non è necessario archiviare per utente di aggiornamento sul server di backend.

Ti consigliamo di seguire l'approccio qui descritto anziché il tecniche supportate dalla versione precedente OAuth 2.0 per le applicazioni web lato client guida.

Configurazione

Per trovare o creare un ID cliente, segui la procedura descritta nella sezione Ottenere il tuo Guida all'ID client API di Google. Successivamente, aggiungi la libreria client alle pagine. sul tuo sito che chiameranno le API di Google. Infine, inizializza il token di alto profilo. In genere, questa operazione viene eseguita all'interno del gestore onload della libreria client.

Inizializzare un client token

Chiama initTokenClient() per inizializzare un nuovo client token con il ID cliente, facoltativamente puoi includere un elenco di uno o più ambiti dell'utente deve accedere a:

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  callback: (response) => {
    ...
  },
});

Attivare il flusso del token OAuth 2.0

Utilizza il metodo requestAccessToken() per attivare il flusso UX del token e ottenere un token di accesso. Google chiede all'utente di:

  • Scegliere l'account
  • accedi all'Account Google se non hai ancora eseguito l'accesso,
  • concedi alla tua app web il consenso per accedere a ciascun ambito richiesto.

Un gesto dell'utente attiva il flusso del token: <button onclick="client.requestAccessToken();">Authorize me</button>

Google restituisce quindi un oggetto TokenResponse contenente un token di accesso e un elenco di Ambiti a cui l'utente ha concesso l'accesso o genera un errore al tuo gestore di callback.

Gli utenti possono chiudere il selettore account o le finestre di accesso. In questo caso, non verrà richiamata.

Il design e l'esperienza utente della tua app devono essere implementati solo dopo un'attenta analisi delle norme relative a OAuth 2.0 di Google. Queste norme coprono lavorare con più ambiti, quando e come gestire il consenso degli utenti e altro ancora.

L'autorizzazione incrementale è una metodologia di progettazione delle app e dei criteri utilizzata per richiedere l'accesso alle risorse, utilizzando gli ambiti, solo in base alle esigenze, anziché in anticipo e tutti insieme. Gli utenti possono approvare o rifiutare la condivisione delle singole risorse richieste dalla tua app, sono note come autorizzazioni granulari.

Durante questa procedura, Google richiede il consenso degli utenti, elencando singolarmente ambito richiesto, gli utenti selezionano le risorse da condividere con la tua app e infine, Google richiama la tua funzione di callback per restituire un token di accesso e gli ambiti approvati. L'app gestisce quindi in modo sicuro i vari risultati possibile grazie alle autorizzazioni granulari.

Autorizzazione incrementale

Per le app web, i seguenti due scenari generali dimostrano l'incrementalità autorizzazione utilizzando:

  • Un'app Ajax di una sola pagina, che spesso utilizza XMLHttpRequest con accesso dinamico a Google Cloud.
  • Più pagine web; le risorse sono separate e gestite in base alla pagina.

Questi due scenari vengono presentati per illustrare considerazioni di progettazione e metodologie, ma non come consigli esaustivi su come per integrare il consenso nella tua app. Le app reali potrebbero utilizzare una variante o combinazione di queste tecniche.

Ajax

Aggiungi il supporto dell'autorizzazione incrementale alla tua app effettuando più chiamate a requestAccessToken() e utilizzando l'oggetto OverridableTokenClientConfig scope per richiedere singoli ambiti nel momento in cui sono necessari e solo quando necessario. In questo esempio, le risorse saranno richieste e saranno visibili solo dopo che l'utente esegue un gesto per espandere una sezione di contenuti compressi.

App Ajax
Inizializza il client token al caricamento della pagina:
        const client = google.accounts.oauth2.initTokenClient({
          client_id: 'YOUR_GOOGLE_CLIENT_ID',
          callback: "onTokenResponse",
        });
      
Richiedi il consenso e ottieni i token di accesso tramite i gesti dell'utente. fai clic su "+" per aprire:

Documenti da leggere

Mostra documenti recenti

          client.requestAccessToken(
            overrideConfig = ({
               scope = 'https://www.googleapis.com/auth/documents.readonly'
             })
           );
        

Prossimi eventi

Mostra informazioni calendario

          client.requestAccessToken(
            overrideConfig = ({
               scope = 'https://www.googleapis.com/auth/calendar.readonly'
             })
           );
        

Visualizzazione delle foto

          client.requestAccessToken(
            overrideConfig = ({
               scope = 'https://www.googleapis.com/auth/photoslibrary.readonly'
             })
           );
        

Ogni chiamata a requestAccessToken attiva un momento di consenso dell'utente, la tua app Avere accesso solo alle risorse richieste dalla sezione di cui l'utente sceglie si espandono, limitando così la condivisione delle risorse attraverso la scelta dell'utente.

Più pagine web

Quando si progetta per l'autorizzazione incrementale, vengono utilizzate più pagine per richiedere solo gli ambiti necessari per caricare una pagina, riducendo la complessità e la necessità effettuare più chiamate per ottenere il consenso degli utenti e recuperare un token di accesso.

App con più pagine
Pagina web Codice
Pagina 1. Documenti da leggere
  const client = google.accounts.oauth2.initTokenClient({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: "onTokenResponse",
    scope: 'https://www.googleapis.com/auth/documents.readonly',
  });
  client.requestAccessToken();
          
Pagina 2. Prossimi eventi
  const client = google.accounts.oauth2.initTokenClient({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: "onTokenResponse",
    scope: 'https://www.googleapis.com/auth/calendar.readonly',
  });
  client.requestAccessToken();
          
Pagina 3. Carosello di foto
  const client = google.accounts.oauth2.initTokenClient({
    client_id: 'YOUR_GOOGLE_CLIENT_ID',
    callback: "onTokenResponse",
    scope: 'https://www.googleapis.com/auth/photoslibrary.readonly',
  });
  client.requestAccessToken();
          

Ogni pagina richiede l'ambito necessario e ottiene un token di accesso chiamando initTokenClient() e requestAccessToken() al momento del caricamento. In questo scenario, le singole pagine web vengono utilizzate per distinguere chiaramente le funzionalità degli utenti e risorse per ambito. In una situazione del mondo reale, singole pagine possono richiedere più ambiti correlati.

Autorizzazioni granulari

Le autorizzazioni granulari vengono gestite allo stesso modo in tutti gli scenari. dopo requestAccessToken() richiama la tua funzione di callback e un token di accesso restituito, verifica che l'utente abbia approvato gli ambiti richiesti utilizzando hasGrantedAllScopes() o hasGrantedAnyScope(). Ad esempio:

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly \
          https://www.googleapis.com/auth/documents.readonly \
          https://www.googleapis.com/auth/photoslibrary.readonly',
  callback: (tokenResponse) => {
    if (tokenResponse && tokenResponse.access_token) {
      if (google.accounts.oauth2.hasGrantedAnyScope(tokenResponse,
          'https://www.googleapis.com/auth/photoslibrary.readonly')) {
        // Look at pictures
        ...
      }
      if (google.accounts.oauth2.hasGrantedAllScopes(tokenResponse,
          'https://www.googleapis.com/auth/calendar.readonly',
          'https://www.googleapis.com/auth/documents.readonly')) {
        // Meeting planning and review documents
        ...
      }
    }
  },
});

Verranno inoltre accettate eventuali concessioni precedentemente accettate da sessioni o richieste precedenti incluso nella risposta. Viene conservato un record del consenso degli utenti per ciascun utente, ID client e persiste per più chiamate a initTokenClient() o requestAccessToken(). Per impostazione predefinita, il consenso dell'utente è necessario solo il primo volta che un utente visita il tuo sito web e richiede un nuovo ambito, ma che potrebbe essere richiesto ogni caricamento pagina utilizzando prompt=consent negli oggetti di configurazione del client token.

Utilizzo dei token

Nel modello Token, un token di accesso non viene archiviato dal sistema operativo o dal browser, un nuovo token viene ottenuto al momento del caricamento della pagina o successivamente attivando un chiamare requestAccessToken() tramite un gesto dell'utente, ad esempio la pressione di un pulsante.

Utilizzo di REST e CORS con le API di Google

È possibile utilizzare un token di accesso per effettuare richieste autenticate alle API di Google utilizzando REST e CORS. Ciò consente agli utenti di accedere, concedere il consenso e Google di emettere un token di accesso e sul tuo sito per lavorare con i dati dell'utente.

In questo esempio, visualizza i prossimi eventi di calendario degli utenti che hanno eseguito l'accesso utilizzando token di accesso restituito da tokenRequest():

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
xhr.setRequestHeader('Authorization', 'Bearer ' + tokenResponse.access_token);
xhr.send();

Per saperne di più, consulta Come utilizzare CORS per accedere alle API di Google.

La prossima sezione illustra come effettuare facilmente l'integrazione con API più complesse.

Utilizzo della libreria JavaScript delle API di Google

Il client token funziona con la libreria client dell'API di Google per JavaScript. Vedi lo snippet di codice riportato di seguito.

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  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(...);
}

Scadenza del token

I token di accesso sono stati progettati per una breve durata. Se il token di accesso scade prima della fine della sessione dell'utente, ottieni un nuovo token chiamando requestAccessToken() da un evento generato dall'utente, ad esempio la pressione di un pulsante.

Chiama il metodo google.accounts.oauth2.revoke per rimuovere il consenso degli utenti e accesso alle risorse per tutti gli ambiti concessi alla tua app. Un accesso valido per revocare questa autorizzazione:

google.accounts.oauth2.revoke('414a76cb127a7ece7ee4bf287602ca2b56f8fcbf7fcecc2cd4e0509268120bd7', done => {
    console.log(done);
    console.log(done.successful);
    console.log(done.error);
    console.log(done.error_description);
  });