La libreria dei Servizi di identità Google consente agli utenti di richiedere un codice di autorizzazione a Google utilizzando un flusso UX di popup o reindirizzamento basato su browser. Viene avviato un flusso OAuth 2.0 sicuro e viene generato un token di accesso utilizzato per chiamare le API di Google per conto di un utente.
Riepilogo del flusso del codice di autorizzazione OAuth 2.0:
- Da un browser, con un gesto come un clic su un pulsante, il proprietario dell'Account Google richiede un codice di autorizzazione a Google.
- Google risponde inviando un codice di autorizzazione univoco a un callback nella tua app web JavaScript in esecuzione nel browser dell'utente o richiama direttamente il tuo endpoint del codice di autorizzazione utilizzando un reindirizzamento del browser.
- La piattaforma di backend ospita un endpoint del codice di autorizzazione e riceve il codice. Dopo la convalida, questo codice viene scambiato per token di accesso e di aggiornamento per utente utilizzando una richiesta all'endpoint dei token di Google.
- Google convalida il codice di autorizzazione, conferma che la richiesta è stata generata dalla tua piattaforma sicura, emette i token di accesso e di aggiornamento e li restituisce chiamando l'endpoint di accesso ospitato dalla tua piattaforma.
- L'endpoint di accesso riceve i token di accesso e di aggiornamento, archiviando in modo sicuro il token di aggiornamento per un uso successivo.
Prerequisiti
Segui i passaggi descritti in Configurazione per configurare la schermata per il consenso OAuth, ottenere un ID client e caricare la libreria client.
Inizializzare un client di codice
Il metodo google.accounts.oauth2.initCodeClient()
inizializza un client di codice.
Modalità popup o reindirizzamento
Puoi scegliere di condividere un codice di autorizzazione utilizzando il flusso utente in modalità Reindirizzamento o Popup. Con la modalità di reindirizzamento, ospiti un endpoint di autorizzazione OAuth2 sul tuo server e Google reindirizza lo user agent a questo endpoint, condividendo il codice di autenticazione come parametro URL. Per la modalità popup, definisci un gestore di callback JavaScript, che invia il codice di autorizzazione al tuo server. La modalità popup può essere utilizzata per offrire un'esperienza utente fluida senza che i visitatori debbano uscire dal tuo sito.
Per inizializzare un client per:
Reindirizza il flusso UX, imposta
ux_mode
suredirect
e il valore diredirect_uri
sull'endpoint del codice di autorizzazione della tua piattaforma. Il valore deve corrispondere esattamente a uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0 configurato nella console API. Inoltre, deve essere conforme alle nostre regole di convalida degli URI di reindirizzamento.Flusso UX popup, imposta
ux_mode
supopup
e il valore dicallback
sul nome della funzione che utilizzerai per inviare i codici di autorizzazione alla tua piattaforma.
Proteggere dagli attacchi CSRF
Per contribuire a prevenire gli attacchi di tipo Cross-Site-Request-Forgery (CSRF), vengono impiegate tecniche leggermente diverse per i flussi UX della modalità di reindirizzamento e popup. Per la modalità di reindirizzamento, viene utilizzato il parametro state di OAuth 2.0. Per ulteriori informazioni sulla generazione e sulla convalida del parametro state, consulta la sezione 10.12 della RFC 6749 Pirateria di richieste cross-site. Con la modalità popup, aggiungi un'intestazione HTTP personalizzata alle richieste e poi sul server confermi che corrisponde al valore e all'origine previsti.
Scegli una modalità UX per visualizzare uno snippet di codice che mostra il codice di autenticazione e la gestione CSRF:
Modalità di reindirizzamento
Inizializza un client in cui Google reindirizza il browser dell'utente al tuo endpoint di autenticazione, condividendo il codice di autenticazione come parametro URL.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_GOOGLE_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'redirect',
redirect_uri: "https://your.domain/code_callback_endpoint",
state: "YOUR_BINDING_VALUE"
});
Modalità popup
Inizializza un client in cui il browser dell'utente riceve un codice di autenticazione da Google e lo invia al tuo server.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_GOOGLE_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', code_receiver_uri, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Set custom header for CRSF
xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
xhr.onload = function() {
console.log('Auth code response: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
},
});
Attiva il flusso di codice OAuth 2.0
Chiama il metodo requestCode()
del client di codice per attivare il flusso dell'utente:
<button onclick="client.requestCode();">Authorize with Google</button>
L'utente dovrà accedere a un Account Google e acconsentire alla condivisione di singoli ambiti prima di restituire un codice di autorizzazione all'endpoint di reindirizzamento o al gestore di callback.
Gestione del codice di autorizzazione
Google genera un codice di autorizzazione univoco per utente che ricevi e verifichi sul tuo server di backend.
Per la modalità popup, il gestore specificato da callback
, in esecuzione nel browser dell'utente, inoltra il codice di autorizzazione a un endpoint ospitato dalla tua piattaforma.
Per la modalità di reindirizzamento, viene inviata una richiesta GET
all'endpoint specificato da
redirect_url
, condividendo il codice di autorizzazione nel parametro URL code. Per ricevere il codice di autorizzazione:
Crea un nuovo endpoint di autorizzazione se non hai un'implementazione esistente oppure
Aggiorna l'endpoint esistente in modo che accetti le richieste
GET
e i parametri URL. In precedenza, veniva utilizzata una richiestaPUT
con il valore del codice di autorizzazione nel payload.
Endpoint di autorizzazione
L'endpoint del codice di autorizzazione deve gestire le richieste GET
con questi parametri di stringa di query dell'URL:
Nome | Valore |
---|---|
authuser | Richiesta di autenticazione per l'accesso dell'utente |
codice | Un codice di autorizzazione OAuth2 generato da Google |
hd | Il dominio ospitato dell'account utente |
prompt | Finestra di dialogo per il consenso dell'utente |
ambito | Elenco separato da spazi di uno o più ambiti OAuth2 da autorizzare |
stato | Variabile di stato CRSF |
Esempio di richiesta GET
con parametri URL a un endpoint denominato auth-code e ospitato da example.com:
Request URL: https://www.example.com/auth-code?state=42a7bd822fe32cc56&code=4/0AX4XfWiAvnXLqxlckFUVao8j0zvZUJ06AMgr-n0vSPotHWcn9p-zHCjqwr47KHS_vDvu8w&scope=email%20profile%20https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/photoslibrary.readonly%20https://www.googleapis.com/auth/contacts.readonly%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&authuser=0&hd=example.com&prompt=consent
Quando il flusso del codice di autorizzazione viene avviato da librerie JavaScript precedenti o da chiamate dirette agli endpoint OAuth 2.0 di Google, viene utilizzata una richiesta POST
.
Esempio di richiesta POST
contenente il codice di autorizzazione come payload nel corpo della richiesta HTTP:
Request URL: https://www.example.com/auth-code
Request Payload: 4/0AX4XfWhll-BMV82wi4YwbrSaTPaRpUGpKqJ4zBxQldU\_70cnIdh-GJOBZlyHU3MNcz4qaw
Convalida la richiesta
Sul server, svolgi i seguenti passaggi per evitare gli attacchi CSRF.
Verifica il valore del parametro state per la modalità di reindirizzamento.
Verifica che l'intestazione X-Requested-With: XmlHttpRequest
sia impostata per la modalità popup.
Dovresti quindi procedere con l'ottenimento dei token di aggiornamento e di accesso da Google solo se hai prima verificato correttamente la richiesta del codice di autenticazione.
Ottenere i token di accesso e di aggiornamento
Dopo che la piattaforma di backend ha ricevuto un codice di autorizzazione da Google e ha verificato la richiesta, utilizza il codice di autenticazione per ottenere token di accesso e di aggiornamento da Google per effettuare chiamate API.
Segui le istruzioni a partire dal Passaggio 5: scambia il codice di autorizzazione con i token di aggiornamento e di accesso della guida Utilizzo di OAuth 2.0 per applicazioni server web.
Gestire i token
La tua piattaforma archivia i token di aggiornamento in modo sicuro. Elimina i token di aggiornamento memorizzati quando vengono rimossi gli account utente o quando il consenso dell'utente viene revocato da google.accounts.oauth2.revoke
o direttamente da https://myaccount.google.com/permissions.
Se vuoi, puoi prendere in considerazione RISC per proteggere gli account utente con la Protezione tra account.
In genere, la piattaforma di backend chiama le API di Google utilizzando un token di accesso. Se la tua app web chiamerà direttamente anche le API di Google dal browser dell'utente, devi implementare un modo per condividere il token di accesso con la tua applicazione web. Questa operazione non rientra nell'ambito di questa guida. Se segui questo approccio e utilizzi la
libreria client delle API di Google per JavaScript, utilizza gapi.client.SetToken()
per memorizzare temporaneamente il token di accesso nella memorizzazione del browser
e consentire alla libreria di chiamare le API di Google.