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.
Come gestire il consenso
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", }); Documenti da leggereMostra documenti recenti client.requestAccessToken( overrideConfig = ({ scope = 'https://www.googleapis.com/auth/documents.readonly' }) ); Prossimi eventiMostra informazioni calendario client.requestAccessToken( overrideConfig = ({ scope = 'https://www.googleapis.com/auth/calendar.readonly' }) ); Carosello di fotoVisualizzazione 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 | ||||||||
---|---|---|---|---|---|---|---|---|
|
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.
Utilizzare un token di accesso per revocare il consenso
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);
});