Utilizzare OAuth 2.0 per le applicazioni server web

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo documento spiega in che modo le applicazioni server web utilizzano le librerie client delle API di Google o gli endpoint OAuth 2.0 di Google per implementare l'autorizzazione OAuth 2.0 ad accedere alle API di Google.

OAuth 2.0 consente agli utenti di condividere dati specifici con un'applicazione mantenendo privati i propri nomi utente, password e altre informazioni. Ad esempio, un'applicazione può utilizzare OAuth 2.0 per ottenere l'autorizzazione degli utenti ad archiviare file sui propri Drive.

Questo flusso OAuth 2.0 è specifico per l'autorizzazione dell'utente. È progettato per le applicazioni che possono memorizzare informazioni riservate e mantenere lo stato. Un'applicazione server web correttamente autorizzata può accedere a un'API mentre l'utente interagisce con l'applicazione o dopo che l'utente ha lasciato l'applicazione.

Spesso le applicazioni server web utilizzano anche gli account di servizio per autorizzare le richieste API, in particolare quando si chiamano API Cloud per accedere ai dati basati sul progetto anziché ai dati specifici dell'utente. Le applicazioni server web possono utilizzare gli account di servizio in combinazione con l'autorizzazione dell'utente.

Librerie client

Gli esempi specifici in questa pagina utilizzano le librerie client delle API di Google per implementare l'autorizzazione OAuth 2.0. Per eseguire gli esempi di codice, devi prima installare la libreria client per la tua lingua.

Quando utilizzi una libreria client delle API di Google per gestire il flusso OAuth 2.0 dell'applicazione, la libreria client esegue molte azioni che l'applicazione dovrebbe altrimenti gestire autonomamente. Ad esempio, determina quando l'applicazione può utilizzare o aggiornare i token di accesso archiviati, nonché quando l'applicazione deve acquisire di nuovo il consenso. La libreria client genera inoltre URL di reindirizzamento corretti e aiuta a implementare i gestori di reindirizzamento che scambiano i codici di autorizzazione per i token di accesso.

Le librerie client delle API di Google per le applicazioni lato server sono disponibili per i seguenti linguaggi:

Prerequisiti

Abilita le API per il tuo progetto

Qualsiasi applicazione che chiami le API di Google deve abilitarle in API Console.

Per abilitare un'API per il tuo progetto:

  1. Open the API Library in Google API Console.
  2. If prompted, select a project, or create a new one.
  3. Nel API Library sono elencate tutte le API disponibili, raggruppate per famiglia di prodotti e popolarità. Se l'API che vuoi abilitare non è visibile nell'elenco, utilizza la ricerca per trovarla o fai clic su Visualizza tutto nella famiglia di prodotti a cui appartiene.
  4. Seleziona l'API che vuoi abilitare, quindi fai clic sul pulsante Abilita.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Creare credenziali di autorizzazione

Qualsiasi applicazione che utilizza OAuth 2.0 per accedere alle API di Google deve disporre di credenziali di autorizzazione che identificano l'applicazione sul server OAuth 2.0 di Google. I passaggi seguenti spiegano come creare credenziali per il tuo progetto. Le applicazioni possono quindi utilizzare le credenziali per accedere alle API che hai abilitato per quel progetto.

  1. Go to the Credentials page.
  2. Fai clic su Crea credenziali > ID client OAuth.
  3. Seleziona il tipo di applicazione Applicazione web.
  4. Compila il modulo e fai clic su Crea. Le applicazioni che utilizzano linguaggi e framework come PHP, Java, Python, Ruby e .NET devono specificare gli URI di reindirizzamento autorizzati. Gli URI di reindirizzamento sono gli endpoint a cui il server OAuth 2.0 può inviare risposte. Questi endpoint devono rispettare le regole di convalida di Google.

    Per i test, puoi specificare gli URI che fanno riferimento alla macchina locale, ad esempio http://localhost:8080. Tieni presente che tutti gli esempi in questo documento utilizzano http://localhost:8080 come URI di reindirizzamento.

    Ti consigliamo di progettare gli endpoint di autenticazione della tua app in modo che la tua applicazione non mostri codici di autorizzazione ad altre risorse nella pagina.

Dopo aver creato le credenziali, scarica il file client_secret.json da API Console. Archivia il file in modo sicuro in una posizione accessibile solo dalla tua applicazione.

Identifica gli ambiti di accesso

Gli ambiti consentono alla tua applicazione di richiedere l'accesso solo alle risorse necessarie, permettendo al contempo agli utenti di controllare la quantità di accesso da concedere all'applicazione. Pertanto, potrebbe esistere una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente.

Prima di iniziare a implementare l'autorizzazione OAuth 2.0, ti consigliamo di identificare gli ambiti a cui la tua app dovrà accedere.

Consigliamo inoltre che l'applicazione richieda l'accesso agli ambiti di autorizzazione tramite una procedura di autorizzazione incrementale, in cui la tua applicazione richiede l'accesso ai dati utente nel contesto. Questa best practice aiuta gli utenti a comprendere più facilmente il motivo per cui la tua applicazione richiede l'accesso richiesto.

Il documento Ambiti API OAuth 2.0 contiene un elenco completo di ambiti che potresti utilizzare per accedere alle API di Google.

Requisiti specifici delle lingue

Per eseguire uno degli esempi di codice in questo documento, devi avere un Account Google, l'accesso a Internet e un browser web. Se utilizzi una delle librerie client API, consulta anche i requisiti specifici del linguaggio riportati di seguito.

PHP

Per eseguire gli esempi di codice PHP in questo documento, devi disporre di:

  • PHP 5.6 o versioni successive con l'interfaccia a riga di comando (CLI) e l'estensione JSON installate.
  • Lo strumento di gestione delle dipendenze Composer.
  • Libreria client delle API di Google per PHP:

    composer require google/apiclient:^2.10

Python

Per eseguire gli esempi di codice Python in questo documento, devi disporre di:

  • Python 2.6 o versioni successive
  • Lo strumento di gestione dei pacchetti pip.
  • La libreria client delle API di Google per Python:
    pip install --upgrade google-api-python-client
  • google-auth, google-auth-oauthlib e google-auth-httplib2 per l'autorizzazione dell'utente.
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • Il framework dell'applicazione web Flask Python.
    pip install --upgrade flask
  • La libreria HTTP requests.
    pip install --upgrade requests

Ruby

Per eseguire gli esempi di codice Ruby in questo documento, devi disporre di:

  • Ruby 2.2.2 o versioni successive
  • La libreria client delle API di Google per Ruby:

    gem install google-api-client
  • Il framework per applicazioni web Sinatra Ruby.

    gem install sinatra

Node.js

Per eseguire gli esempi di codice Node.js in questo documento, devi:

  • La manutenzione LTS, LTS attiva o la versione corrente di Node.js.
  • Il client Node.js delle API di Google:

    npm install googleapis

HTTP/REST

Non è necessario installare alcuna libreria per chiamare direttamente gli endpoint OAuth 2.0.

Ottenere i token di accesso OAuth 2.0

I seguenti passaggi mostrano in che modo la tua applicazione interagisce con il server OAuth 2.0 di Google per ottenere il consenso di un utente di eseguire una richiesta API per suo conto. La tua applicazione deve avere questo consenso prima di poter eseguire una richiesta all'API di Google che richiede l'autorizzazione dell'utente.

Il seguente elenco riassume rapidamente questi passaggi:

  1. L'applicazione identifica le autorizzazioni di cui ha bisogno.
  2. L'applicazione reindirizza l'utente a Google insieme all'elenco delle autorizzazioni richieste.
  3. È l'utente a decidere se concedere le autorizzazioni all'applicazione.
  4. La tua applicazione scopre cosa ha deciso l'utente.
  5. Se l'utente ha concesso le autorizzazioni richieste, l'applicazione recupera i token necessari per effettuare richieste API per conto dell'utente.

Passaggio 1: imposta i parametri di autorizzazione

Il primo passaggio consiste nel creare la richiesta di autorizzazione. La richiesta imposta i parametri che identificano l'applicazione e definiscono le autorizzazioni che l'utente dovrà concedere all'applicazione.

  • Se utilizzi una libreria client Google per l'autenticazione e l'autorizzazione OAuth 2.0, puoi creare e configurare un oggetto che definisce questi parametri.
  • Se chiami direttamente l'endpoint di Google OAuth 2.0, genererai un URL e imposterai i parametri su quell'URL.

Le schede seguenti definiscono i parametri di autorizzazione supportati per le applicazioni server web. Gli esempi specifici di linguaggio mostrano anche come utilizzare una libreria client o una libreria di autorizzazioni per configurare un oggetto che imposta tali parametri.

PHP

Lo snippet di codice riportato di seguito crea un oggetto Google\Client(), che definisce i parametri nella richiesta di autorizzazione.

che utilizza le informazioni del file client_secret.json per identificare la tua applicazione. Per ulteriori informazioni sul file, consulta la sezione Creare credenziali di autorizzazione. L'oggetto identifica anche gli ambiti a cui l'applicazione richiede l'autorizzazione e l'URL all'endpoint di autenticazione dell'applicazione, che gestirà la risposta dal server OAuth 2.0 di Google. Infine, il codice imposta i parametri facoltativi access_type e include_granted_scopes.

Ad esempio, questo codice richiede l'accesso offline in sola lettura a Google Drive di un utente:

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt('consent');
$client->setIncludeGrantedScopes(true);   // incremental auth

La richiesta specifica le seguenti informazioni:

Parametri
client_id Obbligatorio

L'ID client della tua applicazione. Puoi trovare questo valore in API Console Credentials page.

In PHP, chiama la funzione setAuthConfig per caricare le credenziali di autorizzazione da un file client_secret.json.

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
redirect_uri Obbligatorio

Determina dove il server API reindirizza l'utente dopo che l'utente ha completato il flusso di autorizzazione. Il valore deve corrispondere esattamente a uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0, configurato nel API Consoledi Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per client_id fornito, verrà visualizzato un errore redirect_uri_mismatch.

Tieni presente che lo schema http o https, la barra iniziale e la barra finale ('/') devono corrispondere tutti.

Per impostare questo valore in PHP, chiama la funzione setRedirectUri. Tieni presente che devi specificare un URI di reindirizzamento valido per il client_id fornito.

$client->setRedirectUri('https://oauth2.example.com/code');
scope Obbligatorio

Un elenco di ambiti delimitato da spazi che identifica le risorse a cui la tua applicazione potrebbe accedere per conto dell'utente. Questi valori informano la schermata di consenso che Google mostra all'utente.

Gli ambiti consentono alla tua applicazione di richiedere l'accesso solo alle risorse necessarie, permettendo al contempo agli utenti di controllare la quantità di accesso da concedere all'applicazione. Esiste quindi una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente.

Per impostare questo valore in PHP, chiama la funzione addScope:

$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

Ti consigliamo di richiedere all'applicazione di accedere agli ambiti di autorizzazione nel contesto, se possibile. Richiedendo l'accesso ai dati utente nel contesto, tramite autorizzazione incrementale, aiuti gli utenti a comprendere più facilmente il motivo per cui la tua applicazione richiede l'accesso richiesto.

access_type Consigliato

Indica se la tua applicazione può aggiornare i token di accesso quando l'utente non è presente nel browser. I valori parametro validi sono online, ovvero il valore predefinito, e offline.

Imposta il valore su offline se la tua applicazione deve aggiornare i token di accesso quando l'utente non è presente nel browser. Questo è il metodo per aggiornare i token di accesso descritti più avanti in questo documento. Questo valore indica al server di autorizzazione di Google di restituire un token di aggiornamento e un token di accesso la prima volta che l'applicazione scambia un codice di autorizzazione per i token.

Per impostare questo valore in PHP, chiama la funzione setAccessType:

$client->setAccessType('offline');
state Consigliato

Specifica qualsiasi valore di stringa utilizzato dall'applicazione per gestire lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione. Il server restituisce il valore esatto che invii come coppia name=value nel componente della query URL (?) di redirect_uri dopo che l'utente acconsente alla richiesta di accesso della tua applicazione o la rifiuta.

Puoi utilizzare questo parametro per diversi scopi, tra cui indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare nonce e mitigare la falsificazione della richiesta tra siti. Poiché è possibile indovinare redirect_uri, l'uso di un valore state può aumentare la garanzia che una connessione in entrata sia il risultato di una richiesta di autenticazione. Se generi una stringa casuale o codifichi l'hash di un cookie o di un altro valore che acquisisce lo stato del client, puoi convalidare la risposta per assicurarti inoltre che la richiesta e la risposta abbiano origine nello stesso browser, fornendo protezione contro attacchi come la falsificazione cross-site. Consulta la documentazione di OpenID Connect per un esempio di come creare e confermare un token state.

Per impostare questo valore in PHP, chiama la funzione setState:

$client->setState($sample_passthrough_value);
include_granted_scopes Facoltativo

Consente alle applicazioni di utilizzare l'autorizzazione incrementale per richiedere l'accesso ad altri ambiti nel contesto. Se imposti il valore di questo parametro su true e viene concessa la richiesta di autorizzazione, il nuovo token di accesso coprirà anche qualsiasi ambito a cui l'utente ha concesso in precedenza l'accesso all'applicazione. Consulta la sezione relativa all'autorizzazione incrementale per alcuni esempi.

Per impostare questo valore in PHP, chiama la funzione setIncludeGrantedScopes:

$client->setIncludeGrantedScopes(true);
login_hint Facoltativo

Se la tua applicazione sa quale utente sta tentando di eseguire l'autenticazione, può utilizzare questo parametro per fornire un suggerimento al server Google Authentication. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo email nel modulo di accesso o selezionando la sessione multi-login appropriata.

Imposta il valore del parametro su un indirizzo email o su un identificatore sub, che equivale all'ID Google dell'utente.

Per impostare questo valore in PHP, chiama la funzione setLoginHint:

$client->setLoginHint('None');
prompt Facoltativo

Un elenco di prompt, delimitati da maiuscole e minuscole, per presentare l'utente. Se non specifichi questo parametro, all'utente verrà chiesto solo la prima volta che il progetto richiede l'accesso. Per ulteriori informazioni, consulta la sezione Richiedere il consenso.

Per impostare questo valore in PHP, chiama la funzione setApprovalPrompt:

$client->setApprovalPrompt('consent');

I valori possibili sono:

none Non mostrare schermate di autenticazione o consenso. Non deve essere specificato con altri valori.
consent Chiedi il consenso all'utente.
select_account Chiedi all'utente di selezionare un account.

Python

Il seguente snippet di codice utilizza il modulo google-auth-oauthlib.flow per creare la richiesta di autorizzazione.

Il codice crea un oggetto Flow, che identifica la tua applicazione utilizzando le informazioni del file client_secret.json che hai scaricato dopo la creazione di credenziali di autorizzazione. Tale oggetto identifica anche gli ambiti a cui l'applicazione richiede l'autorizzazione per l'accesso e l'URL dell'endpoint di autenticazione dell'applicazione, che gestirà la risposta dal server OAuth 2.0 di Google. Infine, il codice imposta i parametri facoltativi access_type e include_granted_scopes.

Ad esempio, questo codice richiede l'accesso offline in sola lettura a Google Drive di un utente:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

# Indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
flow.redirect_uri = 'https://www.example.com/oauth2callback'

# Generate URL for request to Google's OAuth 2.0 server.
# Use kwargs to set optional request parameters.
authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')

La richiesta specifica le seguenti informazioni:

Parametri
client_id Obbligatorio

L'ID client della tua applicazione. Puoi trovare questo valore in API Console Credentials page.

In Python, chiama il metodo from_client_secrets_file per recuperare l'ID client da un file client_secret.json. Puoi anche utilizzare il metodo from_client_config, che trasmette la configurazione del client come appare in origine in un file del client secret, ma non accede al file stesso.

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])
redirect_uri Obbligatorio

Determina dove il server API reindirizza l'utente dopo che l'utente ha completato il flusso di autorizzazione. Il valore deve corrispondere esattamente a uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0, configurato nel API Consoledi Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per client_id fornito, verrà visualizzato un errore redirect_uri_mismatch.

Tieni presente che lo schema http o https, la barra iniziale e la barra finale ('/') devono corrispondere tutti.

Per impostare questo valore in Python, imposta la proprietà redirect_uri dell'oggetto flow:

flow.redirect_uri = 'https://oauth2.example.com/code'
scope Obbligatorio

Un elenco di ambiti che identificano le risorse a cui la tua applicazione potrebbe accedere per conto dell'utente. Questi valori informano la schermata di consenso che Google mostra all'utente.

Gli ambiti consentono alla tua applicazione di richiedere l'accesso solo alle risorse necessarie, permettendo al contempo agli utenti di controllare la quantità di accesso da concedere all'applicazione. Esiste quindi una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente.

In Python, usa lo stesso metodo che usi per impostare client_id per specificare l'elenco degli ambiti.

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

Ti consigliamo di richiedere all'applicazione di accedere agli ambiti di autorizzazione nel contesto, se possibile. Richiedendo l'accesso ai dati utente nel contesto, tramite autorizzazione incrementale, aiuti gli utenti a comprendere più facilmente il motivo per cui la tua applicazione richiede l'accesso richiesto.

access_type Consigliato

Indica se la tua applicazione può aggiornare i token di accesso quando l'utente non è presente nel browser. I valori parametro validi sono online, ovvero il valore predefinito, e offline.

Imposta il valore su offline se la tua applicazione deve aggiornare i token di accesso quando l'utente non è presente nel browser. Questo è il metodo per aggiornare i token di accesso descritti più avanti in questo documento. Questo valore indica al server di autorizzazione di Google di restituire un token di aggiornamento e un token di accesso la prima volta che l'applicazione scambia un codice di autorizzazione per i token.

In Python, imposta il parametro access_type specificando access_type come argomento della parola chiave quando chiami il metodo flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
state Consigliato

Specifica qualsiasi valore di stringa utilizzato dall'applicazione per gestire lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione. Il server restituisce il valore esatto che invii come coppia name=value nel componente della query URL (?) di redirect_uri dopo che l'utente acconsente alla richiesta di accesso della tua applicazione o la rifiuta.

Puoi utilizzare questo parametro per diversi scopi, tra cui indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare nonce e mitigare la falsificazione della richiesta tra siti. Poiché è possibile indovinare redirect_uri, l'uso di un valore state può aumentare la garanzia che una connessione in entrata sia il risultato di una richiesta di autenticazione. Se generi una stringa casuale o codifichi l'hash di un cookie o di un altro valore che acquisisce lo stato del client, puoi convalidare la risposta per assicurarti inoltre che la richiesta e la risposta abbiano origine nello stesso browser, fornendo protezione contro attacchi come la falsificazione cross-site. Consulta la documentazione di OpenID Connect per un esempio di come creare e confermare un token state.

In Python, imposta il parametro state specificando state come argomento di parola chiave quando chiami il metodo flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    state=sample_passthrough_value,
    include_granted_scopes='true')
include_granted_scopes Facoltativo

Consente alle applicazioni di utilizzare l'autorizzazione incrementale per richiedere l'accesso ad altri ambiti nel contesto. Se imposti il valore di questo parametro su true e viene concessa la richiesta di autorizzazione, il nuovo token di accesso coprirà anche qualsiasi ambito a cui l'utente ha concesso in precedenza l'accesso all'applicazione. Consulta la sezione relativa all'autorizzazione incrementale per alcuni esempi.

In Python, imposta il parametro include_granted_scopes specificando include_granted_scopes come argomento della parola chiave quando chiami il metodo flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
login_hint Facoltativo

Se la tua applicazione sa quale utente sta tentando di eseguire l'autenticazione, può utilizzare questo parametro per fornire un suggerimento al server Google Authentication. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo email nel modulo di accesso o selezionando la sessione multi-login appropriata.

Imposta il valore del parametro su un indirizzo email o su un identificatore sub, che equivale all'ID Google dell'utente.

In Python, imposta il parametro login_hint specificando login_hint come argomento della parola chiave quando chiami il metodo flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    login_hint='None',
    include_granted_scopes='true')
prompt Facoltativo

Un elenco di prompt, delimitati da maiuscole e minuscole, per presentare l'utente. Se non specifichi questo parametro, all'utente verrà chiesto solo la prima volta che il progetto richiede l'accesso. Per ulteriori informazioni, consulta la sezione Richiedere il consenso.

In Python, imposta il parametro prompt specificando prompt come argomento di parola chiave quando chiami il metodo flow.authorization_url:

authorization_url, state = flow.authorization_url(
      access_type='offline',
      prompt='consent',
      include_granted_scopes='true')

I valori possibili sono:

none Non mostrare schermate di autenticazione o consenso. Non deve essere specificato con altri valori.
consent Chiedi il consenso all'utente.
select_account Chiedi all'utente di selezionare un account.

Ruby

Utilizza il file client_secrets.json che hai creato per configurare un oggetto client nella tua applicazione. Quando configuri un oggetto client, specifichi gli ambiti a cui deve accedere l'applicazione, insieme all'URL dell'endpoint di autenticazione dell'applicazione, che gestirà la risposta dal server OAuth 2.0.

Ad esempio, questo codice richiede l'accesso offline in sola lettura a Google Drive di un utente:

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'

client_secrets = Google::APIClient::ClientSecrets.load
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'http://www.example.com/oauth2callback',
  :additional_parameters => {
    "access_type" => "offline",         # offline access
    "include_granted_scopes" => "true"  # incremental auth
  }
)

L'applicazione utilizza l'oggetto client per eseguire operazioni OAuth 2.0, ad esempio generare URL di richiesta di autorizzazione e applicare token di accesso alle richieste HTTP.

Node.js

Lo snippet di codice riportato di seguito crea un oggetto google.auth.OAuth2, che definisce i parametri nella richiesta di autorizzazione.

che utilizza le informazioni del tuo file client_secret.json per identificare l'applicazione. Per chiedere le autorizzazioni a un utente per recuperare un token di accesso, devi reindirizzarlo a una pagina di consenso. Per creare l'URL di una pagina di consenso:

const {google} = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
 * from the client_secret.json file. To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

Nota importante: refresh_token viene restituito solo alla prima autorizzazione. Ulteriori dettagli sono disponibili qui.

HTTP/REST

L'endpoint OAuth 2.0 di Google si trova all'indirizzo https://accounts.google.com/o/oauth2/v2/auth. Questo endpoint è accessibile solo tramite HTTPS. Le connessioni HTTP semplici sono rifiutate.

Il server di autorizzazione di Google supporta i seguenti parametri della stringa di query per le applicazioni server web:

Parametri
client_id Obbligatorio

L'ID client della tua applicazione. Puoi trovare questo valore in API Console Credentials page.

redirect_uri Obbligatorio

Determina dove il server API reindirizza l'utente dopo che l'utente ha completato il flusso di autorizzazione. Il valore deve corrispondere esattamente a uno degli URI di reindirizzamento autorizzati per il client OAuth 2.0, configurato nel API Consoledi Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per client_id fornito, verrà visualizzato un errore redirect_uri_mismatch.

Tieni presente che lo schema http o https, la barra iniziale e la barra finale ('/') devono corrispondere tutti.

response_type Obbligatorio

Determina se l'endpoint di Google OAuth 2.0 restituisce un codice di autorizzazione.

Imposta il valore del parametro su code per le applicazioni server web.

scope Obbligatorio

Un elenco di ambiti delimitato da spazi che identifica le risorse a cui la tua applicazione potrebbe accedere per conto dell'utente. Questi valori informano la schermata di consenso che Google mostra all'utente.

Gli ambiti consentono alla tua applicazione di richiedere l'accesso solo alle risorse necessarie, permettendo al contempo agli utenti di controllare la quantità di accesso da concedere all'applicazione. Esiste quindi una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente.

Ti consigliamo di richiedere all'applicazione di accedere agli ambiti di autorizzazione nel contesto, se possibile. Richiedendo l'accesso ai dati utente nel contesto, tramite autorizzazione incrementale, aiuti gli utenti a comprendere più facilmente il motivo per cui la tua applicazione richiede l'accesso richiesto.

access_type Consigliato

Indica se la tua applicazione può aggiornare i token di accesso quando l'utente non è presente nel browser. I valori parametro validi sono online, ovvero il valore predefinito, e offline.

Imposta il valore su offline se la tua applicazione deve aggiornare i token di accesso quando l'utente non è presente nel browser. Questo è il metodo per aggiornare i token di accesso descritti più avanti in questo documento. Questo valore indica al server di autorizzazione di Google di restituire un token di aggiornamento e un token di accesso la prima volta che l'applicazione scambia un codice di autorizzazione per i token.

state Consigliato

Specifica qualsiasi valore di stringa utilizzato dall'applicazione per gestire lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione. Il server restituisce il valore esatto che invii come coppia name=value nel componente della query URL (?) di redirect_uri dopo che l'utente acconsente alla richiesta di accesso della tua applicazione o la rifiuta.

Puoi utilizzare questo parametro per diversi scopi, tra cui indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare nonce e mitigare la falsificazione della richiesta tra siti. Poiché è possibile indovinare redirect_uri, l'uso di un valore state può aumentare la garanzia che una connessione in entrata sia il risultato di una richiesta di autenticazione. Se generi una stringa casuale o codifichi l'hash di un cookie o di un altro valore che acquisisce lo stato del client, puoi convalidare la risposta per assicurarti inoltre che la richiesta e la risposta abbiano origine nello stesso browser, fornendo protezione contro attacchi come la falsificazione cross-site. Consulta la documentazione di OpenID Connect per un esempio di come creare e confermare un token state.

include_granted_scopes Facoltativo

Consente alle applicazioni di utilizzare l'autorizzazione incrementale per richiedere l'accesso ad altri ambiti nel contesto. Se imposti il valore di questo parametro su true e viene concessa la richiesta di autorizzazione, il nuovo token di accesso coprirà anche qualsiasi ambito a cui l'utente ha concesso in precedenza l'accesso all'applicazione. Consulta la sezione relativa all'autorizzazione incrementale per alcuni esempi.

login_hint Facoltativo

Se la tua applicazione sa quale utente sta tentando di eseguire l'autenticazione, può utilizzare questo parametro per fornire un suggerimento al server Google Authentication. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo email nel modulo di accesso o selezionando la sessione multi-login appropriata.

Imposta il valore del parametro su un indirizzo email o su un identificatore sub, che equivale all'ID Google dell'utente.

prompt Facoltativo

Un elenco di prompt, delimitati da maiuscole e minuscole, per presentare l'utente. Se non specifichi questo parametro, all'utente verrà chiesto solo la prima volta che il progetto richiede l'accesso. Per ulteriori informazioni, consulta la sezione Richiedere il consenso.

I valori possibili sono:

none Non mostrare schermate di autenticazione o consenso. Non deve essere specificato con altri valori.
consent Chiedi il consenso all'utente.
select_account Chiedi all'utente di selezionare un account.

Passaggio 2: reindirizza al server OAuth 2.0 di Google

Reindirizza l'utente al server OAuth 2.0 di Google per avviare la procedura di autenticazione e autorizzazione. In genere, questo si verifica quando la tua applicazione deve accedere per la prima volta ai dati dell'utente. Nel caso dell'autorizzazione incrementale, questo passaggio si verifica anche quando l'applicazione deve accedere per la prima volta a risorse aggiuntive a cui non ha ancora l'autorizzazione ad accedere.

PHP

  1. Genera un URL per richiedere l'accesso dal server OAuth 2.0 di Google:
    $auth_url = $client->createAuthUrl();
  2. Reindirizza l'utente a $auth_url:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

Questo esempio mostra come reindirizzare l'utente all'URL di autorizzazione utilizzando il framework dell'applicazione web Flask:

return flask.redirect(authorization_url)

Ruby

  1. Genera un URL per richiedere l'accesso dal server OAuth 2.0 di Google:
    auth_uri = auth_client.authorization_uri.to_s
  2. Reindirizza l'utente a auth_uri.

Node.js

  1. Utilizza l'URL authorizationUrl generato dal metodo Passaggio 1 generateAuthUrl per richiedere l'accesso dal server OAuth 2.0 di Google.
  2. Reindirizza l'utente a authorizationUrl.
    res.writeHead(301, { "Location": authorizationUrl });

HTTP/REST

Sample redirect to Google's authorization server

An example URL is shown below, with line breaks and spaces for readability.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Dopo aver creato l'URL della richiesta, reindirizza l'utente.

Il server OAuth 2.0 di Google autentica l'utente e ottiene il consenso dell'utente per l'applicazione ad accedere agli ambiti richiesti. La risposta viene inviata nuovamente alla tua applicazione utilizzando l'URL di reindirizzamento specificato.

Passaggio 3: Google richiede il consenso dell'utente

In questo passaggio, l'utente decide se concedere alla tua applicazione l'accesso richiesto. In questa fase, Google mostra una finestra di consenso che mostra il nome della tua applicazione e i servizi API di Google a cui richiede l'autorizzazione di accesso con le credenziali di autorizzazione dell'utente e un riepilogo degli ambiti di accesso da concedere. L'utente può quindi acconsentire all'accesso a uno o più ambiti richiesti dalla tua applicazione o rifiutare la richiesta.

In questa fase l'applicazione non deve fare nulla mentre attende la risposta dal server OAuth 2.0 di Google, che indica se è stato concesso qualsiasi accesso. La risposta viene descritta nel passaggio successivo.

Errori

Le richieste all'endpoint di autorizzazione OAuth 2.0 di Google potrebbero mostrare messaggi di errore rivolti all'utente invece dei flussi di autenticazione e autorizzazione previsti. Di seguito sono riportati i codici di errore comuni e le relative soluzioni.

admin_policy_enforced

L'Account Google non è in grado di autorizzare uno o più ambiti richiesti a causa dei criteri del suo amministratore di Google Workspace. Consulta l'articolo del Centro assistenza per gli amministratori di Google Workspace Controllare quali app di terze parti e interne possono accedere ai dati di Google Workspace Per ulteriori informazioni su come un amministratore può limitare l'accesso a tutti gli ambiti o a ambiti sensibili e con restrizioni, fino a quando non verrà concesso esplicitamente l'accesso al tuo ID client OAuth.

disallowed_useragent

L'endpoint di autorizzazione viene visualizzato in uno user agent incorporato non consentito dai criteri OAuth 2.0 di Google.

Android

Gli sviluppatori Android potrebbero ricevere questo messaggio di errore quando aprono le richieste di autorizzazione in android.webkit.WebView. Gli sviluppatori dovrebbero invece utilizzare le librerie Android come Accedi con Google per Android o AppAuth per Android di OpenID Foundation.

Gli sviluppatori web potrebbero riscontrare questo errore quando un'app Android apre un link web generale in uno user agent incorporato e un utente accede all'endpoint di autorizzazione OAuth 2.0 di Google dal tuo sito. Gli sviluppatori devono consentire l'apertura dei link generali nel gestore di link predefinito del sistema operativo, che include sia i gestori di link per app Android sia l'app predefinita del browser. Anche la libreria Schede personalizzate di Android è un'opzione supportata.

iOS

Gli sviluppatori iOS e macOS potrebbero riscontrare questo errore quando aprono le richieste di autorizzazione in WKWebView. Gli sviluppatori dovrebbero invece utilizzare le librerie iOS come Accedi con Google per iOS o AppAuth per iOS di OpenID Foundation.

Gli sviluppatori web potrebbero riscontrare questo errore quando un'app per iOS o macOS apre un link web generale in uno user agent incorporato e un utente accede all'endpoint di autorizzazione OAuth 2.0 di Google dal tuo sito. Gli sviluppatori devono consentire l'apertura dei link generali nel gestore di link predefinito del sistema operativo, che include sia i gestori di link universali sia l'app del browser predefinita. La libreria SFSafariViewController è anche un'opzione supportata.

org_internal

L'ID client OAuth nella richiesta fa parte di un progetto che limita l'accesso agli Account Google di una organizzazione Google Cloud specifica. Per ulteriori informazioni su questa opzione di configurazione, consulta la sezione Tipo di utente nell'articolo della guida Configurare la schermata per il consenso OAuth.

redirect_uri_mismatch

Il redirect_uri passato nella richiesta di autorizzazione non corrisponde a un URI di reindirizzamento autorizzato per l'ID client OAuth. Esamina gli URI di reindirizzamento autorizzati nella Google API Console Credentials page.

Passaggio 4: gestisci la risposta del server OAuth 2.0

Il server OAuth 2.0 risponde alla richiesta di accesso della tua applicazione utilizzando l'URL specificato nella richiesta.

Se l'utente approva la richiesta di accesso, la risposta conterrà un codice di autorizzazione. Se l'utente non approva la richiesta, la risposta contiene un messaggio di errore. Il codice di autorizzazione o il messaggio di errore restituito al server web vengono visualizzati nella stringa di query, come mostrato di seguito:

Una risposta di errore:

https://oauth2.example.com/auth?error=access_denied

Una risposta al codice di autorizzazione:

https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

Esempio di risposta del server OAuth 2.0

Puoi testare questo flusso facendo clic sul seguente URL di esempio, che richiede l'accesso in sola lettura per visualizzare i metadati dei file su Google Drive:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Dopo aver completato il flusso OAuth 2.0, dovresti essere reindirizzato a http://localhost/oauth2callback, che probabilmente restituirà un errore 404 NOT FOUND a meno che la tua macchina locale non pubblichi un file a tale indirizzo. Il passaggio successivo fornisce ulteriori dettagli sulle informazioni restituite nell'URI quando l'utente viene reindirizzato alla tua applicazione.

Passaggio 5: codice di autorizzazione di Exchange per i token di aggiornamento e di accesso

Dopo aver ricevuto il codice di autorizzazione, il server web può scambiarlo con un token di accesso.

PHP

Per scambiare un codice di autorizzazione con un token di accesso, utilizza il metodo authenticate:

$client->authenticate($_GET['code']);

Puoi recuperare il token di accesso con il metodo getAccessToken:

$access_token = $client->getAccessToken();

Python

Nella pagina di callback, utilizza la libreria google-auth per verificare la risposta del server di autorizzazione. Quindi, usa il metodo flow.fetch_token per scambiare il codice di autorizzazione nella risposta con un token di accesso:

state = flask.session['state']
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'],
    state=state)
flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

authorization_response = flask.request.url
flow.fetch_token(authorization_response=authorization_response)

# Store the credentials in the session.
# ACTION ITEM for developers:
#     Store user's access and refresh tokens in your data store if
#     incorporating this code into your real app.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'token_uri': credentials.token_uri,
    'client_id': credentials.client_id,
    'client_secret': credentials.client_secret,
    'scopes': credentials.scopes}

Ruby

Per scambiare un codice di autorizzazione con un token di accesso, utilizza il metodo fetch_access_token!:

auth_client.code = auth_code
auth_client.fetch_access_token!

Node.js

Per scambiare un codice di autorizzazione con un token di accesso, utilizza il metodo getToken:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
if (req.url.startsWith('/oauth2callback')) {
  // Handle the OAuth 2.0 server response
  let q = url.parse(req.url, true).query;

  // Get access and refresh tokens (if access_type is offline)
  let { tokens } = await oauth2Client.getToken(q.code);
  oauth2Client.setCredentials(tokens);
}

HTTP/REST

Per scambiare un codice di autorizzazione con un token di accesso, chiama l'endpoint https://oauth2.googleapis.com/token e imposta i seguenti parametri:

Campi
client_id L'ID client ottenuto dalla API Console Credentials page.
client_secret Il client secret ottenuto dal API Console Credentials page.
code Codice di autorizzazione restituito dalla richiesta iniziale.
grant_type Come definito nella specifica OAuth 2.0, il valore di questo campo deve essere impostato su authorization_code.
redirect_uri Uno degli URI di reindirizzamento elencati per il tuo progetto in API Console Credentials page per il client_id dato.

Lo snippet che segue mostra una richiesta di esempio:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

Google risponde a questa richiesta restituendo un oggetto JSON contenente un token di accesso di breve durata e un token di aggiornamento. Tieni presente che il token di aggiornamento viene restituito solo se la tua applicazione ha impostato il parametro access_type su offline nella richiesta iniziale sul server di autorizzazione di Google.

La risposta contiene i seguenti campi:

Campi
access_token Il token inviato dalla tua applicazione per autorizzare una richiesta API di Google.
expires_in La durata rimanente del token di accesso in secondi.
refresh_token Un token che puoi utilizzare per ottenere un nuovo token di accesso. I token di aggiornamento sono validi finché l'utente non revoca l'accesso. Anche in questo caso, questo campo è presente in questa risposta solo se imposti il parametro access_type su offline nella richiesta iniziale al server di autorizzazione di Google.
scope Gli ambiti di accesso concessi dall'elemento access_token sono espressi come elenco di stringhe sensibili alle maiuscole, separate da spazi.
token_type Il tipo di token restituito. Al momento, il valore di questo campo è sempre impostato su Bearer.

Il seguente snippet mostra una risposta di esempio:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

Chiamata alle API di Google

PHP

Utilizza il token di accesso per chiamare le API di Google completando i seguenti passaggi:

  1. Se devi applicare un token di accesso a un nuovo oggetto Google\Client, ad esempio se hai memorizzato il token di accesso in una sessione utente, utilizza il metodo setAccessToken:
    $client->setAccessToken($access_token);
  2. Crea un oggetto di servizio per l'API che vuoi chiamare. Per creare un oggetto di servizio fornisci un oggetto Google\Client autorizzato al costruttore per l'API che vuoi chiamare. Ad esempio, per chiamare l'API Drive:
    $drive = new Google\Service\Drive($client);
  3. Fai richieste al servizio API utilizzando l'interfaccia fornita dall'oggetto di servizio. Ad esempio, per elencare i file nel Google Drive dell'utente autenticato:
    $files = $drive->files->listFiles(array())->getItems();

Python

Dopo aver ottenuto un token di accesso, l'applicazione può utilizzarlo per autorizzare le richieste API per conto di un determinato account utente o account di servizio. Utilizza le credenziali di autorizzazione specifiche dell'utente per creare un oggetto di servizio per l'API che vuoi chiamare, quindi utilizza tale oggetto per effettuare le richieste API autorizzate.

  1. Crea un oggetto di servizio per l'API che vuoi chiamare. Per creare un oggetto di servizio, chiama il metodo build della libreria googleapiclient.discovery con il nome e la versione dell'API e le credenziali utente: ad esempio per chiamare la versione 2 dell'API Drive:
    from googleapiclient.discovery import build
    
    drive = build('drive', 'v2', credentials=credentials)
  2. Fai richieste al servizio API utilizzando l'interfaccia fornita dall'oggetto di servizio. Ad esempio, per elencare i file nel Google Drive dell'utente autenticato:
    files = drive.files().list().execute()

Ruby

Utilizza l'oggetto auth_client per chiamare le API di Google completando i seguenti passaggi:

  1. Crea un oggetto di servizio per l'API che vuoi chiamare. Ad esempio, per chiamare la versione 2 dell'API Drive:
    drive = Google::Apis::DriveV2::DriveService.new
  2. Imposta le credenziali sul servizio:
    drive.authorization = auth_client
  3. Fai richieste al servizio API utilizzando l'interfaccia fornita dall'oggetto di servizio. Ad esempio, per elencare i file nel Google Drive dell'utente autenticato:
    files = drive.list_files

In alternativa, l'autorizzazione può essere fornita in base al metodo fornendo il parametro options a un metodo:

files = drive.list_files(options: { authorization: auth_client })

Node.js

Dopo aver ottenuto un token di accesso e averlo impostato sull'oggetto OAuth2, utilizzalo per chiamare le API di Google. La tua applicazione può utilizzare tale token per autorizzare le richieste API per conto di un determinato account utente o account di servizio. Crea un oggetto di servizio per l'API che vuoi chiamare.

const { google } = require('googleapis');

// Example of using Google Drive API to list filenames in user's Drive.
const drive = google.drive('v3');
drive.files.list({
  auth: oauth2Client,
  pageSize: 10,
  fields: 'nextPageToken, files(id, name)',
}, (err1, res1) => {
  if (err1) return console.log('The API returned an error: ' + err1);
  const files = res1.data.files;
  if (files.length) {
    console.log('Files:');
    files.map((file) => {
      console.log(`${file.name} (${file.id})`);
    });
  } else {
    console.log('No files found.');
  }
});

HTTP/REST

Dopo che l'applicazione ha ottenuto un token di accesso, puoi utilizzarlo per effettuare chiamate a un'API Google per conto di un determinato account utente se sono stati concessi gli ambiti di accesso richiesti dall'API. A tale scopo, includi il token di accesso in una richiesta all'API includendo un parametro di ricerca access_token o un valore Bearer dell'intestazione HTTP Authorization. Quando possibile, è preferibile l'intestazione HTTP, poiché le stringhe di query tendono a essere visibili nei log del server. Nella maggior parte dei casi puoi utilizzare una libreria client per configurare le chiamate alle API di Google (ad esempio, quando chiama l'API Drive Files).

Puoi provare tutte le API di Google e visualizzarne gli ambiti nel Playground OAuth 2.0.

Esempi GET HTTP

Una chiamata all'endpoint drive.files (l'API Drive File) che utilizza l'intestazione HTTP Authorization: Bearer potrebbe avere il seguente aspetto. Tieni presente che devi specificare il tuo token di accesso:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Ecco una chiamata alla stessa API per l'utente autenticato utilizzando il parametro della stringa di query access_token:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

Esempi di curl

Puoi testare questi comandi con l'applicazione a riga di comando curl. Ecco un esempio che utilizza l'opzione dell'intestazione HTTP (opzione preferita):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

In alternativa, l'opzione del parametro stringa di query:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

Completa l'esempio

L'esempio seguente stampa un elenco in formato JSON dei file presenti nel Google Drive dell'utente dopo che l'utente ha eseguito l'autenticazione e dà il consenso all'applicazione per accedere ai metadati di Drive dell'utente.

PHP

Per eseguire questo esempio:

  1. In API Console, aggiungi l'URL della macchina locale all'elenco di URL di reindirizzamento, ad esempio http://localhost:8080.
  2. Crea una nuova directory e modificala. Ad esempio:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. Installa la Google API Client Library per PHP utilizzando Writer:
    composer require google/apiclient:^2.10
  4. Crea i file index.php e oauth2callback.php con i contenuti di seguito.
  5. Esegui l'esempio con un server web configurato per gestire PHP. Se utilizzi PHP 5.6 o versioni successive, puoi utilizzare il server web di test integrato di PHP:
    php -S localhost:8080 ~/php-oauth2-example

file index.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfig('client_secrets.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  $drive = new Google\Service\Drive($client);
  $files = $drive->files->listFiles(array())->getItems();
  echo json_encode($files);
} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

oauth2callback.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfigFile('client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (! isset($_GET['code'])) {
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

Python

In questo esempio viene utilizzato il framework Flask. Esecuzione di un'applicazione web all'indirizzo http://localhost:8080 che consente di testare il flusso OAuth 2.0. Se accedi all'URL, dovresti vedere quattro link:

  • Testa una richiesta API: questo link rimanda a una pagina che tenta di eseguire una richiesta API di esempio. Se necessario, avvia il flusso di autorizzazione. In caso di esito positivo, la pagina mostra la risposta dell'API.
  • Testa direttamente il flusso di autenticazione: questo link rimanda a una pagina che tenta di inviare l'utente tramite il flusso di autorizzazione. L'app richiede l'autorizzazione per inviare richieste API autorizzate per conto dell'utente.
  • Revocare le credenziali correnti:questo link rimanda a una pagina che revoca le autorizzazioni che l'utente ha già concesso all'applicazione.
  • Cancella le credenziali della sessione Flask: questo link cancella le credenziali di autorizzazione archiviate nella sessione Flask. In questo modo puoi vedere cosa succede se un utente che ha già concesso l'autorizzazione alla tua app ha tentato di eseguire una richiesta API in una nuova sessione. Inoltre, ti consente di vedere la risposta API che l'app otterrebbe se un utente ha revocato le autorizzazioni concesse per l'app e l'app ha ancora provato ad autorizzare una richiesta con un token di accesso revocato.
# -*- coding: utf-8 -*-

import os
import flask
import requests

import google.oauth2.credentials
import google_auth_oauthlib.flow
import googleapiclient.discovery

# This variable specifies the name of a file that contains the OAuth 2.0
# information for this application, including its client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
API_SERVICE_NAME = 'drive'
API_VERSION = 'v2'

app = flask.Flask(__name__)
# Note: A secret key is included in the sample so that it works.
# If you use this code in your application, replace this with a truly secret
# key. See https://flask.palletsprojects.com/quickstart/#sessions.
app.secret_key = 'REPLACE ME - this value is here as a placeholder.'


@app.route('/')
def index():
  return print_index_table()


@app.route('/test')
def test_api_request():
  if 'credentials' not in flask.session:
    return flask.redirect('authorize')

  # Load credentials from the session.
  credentials = google.oauth2.credentials.Credentials(
      **flask.session['credentials'])

  drive = googleapiclient.discovery.build(
      API_SERVICE_NAME, API_VERSION, credentials=credentials)

  files = drive.files().list().execute()

  # Save credentials back to session in case access token was refreshed.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.jsonify(**files)


@app.route('/authorize')
def authorize():
  # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps.
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES)

  # The URI created here must exactly match one of the authorized redirect URIs
  # for the OAuth 2.0 client, which you configured in the API Console. If this
  # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch'
  # error.
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  authorization_url, state = flow.authorization_url(
      # Enable offline access so that you can refresh an access token without
      # re-prompting the user for permission. Recommended for web server apps.
      access_type='offline',
      # Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes='true')

  # Store the state so the callback can verify the auth server response.
  flask.session['state'] = state

  return flask.redirect(authorization_url)


@app.route('/oauth2callback')
def oauth2callback():
  # Specify the state when creating the flow in the callback so that it can
  # verified in the authorization server response.
  state = flask.session['state']

  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  # Use the authorization server's response to fetch the OAuth 2.0 tokens.
  authorization_response = flask.request.url
  flow.fetch_token(authorization_response=authorization_response)

  # Store credentials in the session.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  credentials = flow.credentials
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.redirect(flask.url_for('test_api_request'))


@app.route('/revoke')
def revoke():
  if 'credentials' not in flask.session:
    return ('You need to <a href="/authorize">authorize</a> before ' +
            'testing the code to revoke credentials.')

  credentials = google.oauth2.credentials.Credentials(
    **flask.session['credentials'])

  revoke = requests.post('https://oauth2.googleapis.com/revoke',
      params={'token': credentials.token},
      headers = {'content-type': 'application/x-www-form-urlencoded'})

  status_code = getattr(revoke, 'status_code')
  if status_code == 200:
    return('Credentials successfully revoked.' + print_index_table())
  else:
    return('An error occurred.' + print_index_table())


@app.route('/clear')
def clear_credentials():
  if 'credentials' in flask.session:
    del flask.session['credentials']
  return ('Credentials have been cleared.<br><br>' +
          print_index_table())


def credentials_to_dict(credentials):
  return {'token': credentials.token,
          'refresh_token': credentials.refresh_token,
          'token_uri': credentials.token_uri,
          'client_id': credentials.client_id,
          'client_secret': credentials.client_secret,
          'scopes': credentials.scopes}

def print_index_table():
  return ('<table>' +
          '<tr><td><a href="/test">Test an API request</a></td>' +
          '<td>Submit an API request and see a formatted JSON response. ' +
          '    Go through the authorization flow if there are no stored ' +
          '    credentials for the user.</td></tr>' +
          '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' +
          '<td>Go directly to the authorization flow. If there are stored ' +
          '    credentials, you still might not be prompted to reauthorize ' +
          '    the application.</td></tr>' +
          '<tr><td><a href="/revoke">Revoke current credentials</a></td>' +
          '<td>Revoke the access token associated with the current user ' +
          '    session. After revoking credentials, if you go to the test ' +
          '    page, you should see an <code>invalid_grant</code> error.' +
          '</td></tr>' +
          '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' +
          '<td>Clear the access token currently stored in the user session. ' +
          '    After clearing the token, if you <a href="/test">test the ' +
          '    API request</a> again, you should go back to the auth flow.' +
          '</td></tr></table>')


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification.
  # ACTION ITEM for developers:
  #     When running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

  # Specify a hostname and port that are set as a valid redirect URI
  # for your API project in the Google API Console.
  app.run('localhost', 8080, debug=True)

Ruby

In questo esempio viene utilizzato il framework Sinatra.

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'
require 'json'
require 'sinatra'

enable :sessions
set :session_secret, 'setme'

get '/' do
  unless session.has_key?(:credentials)
    redirect to('/oauth2callback')
  end
  client_opts = JSON.parse(session[:credentials])
  auth_client = Signet::OAuth2::Client.new(client_opts)
  drive = Google::Apis::DriveV2::DriveService.new
  files = drive.list_files(options: { authorization: auth_client })
  "<pre>#{JSON.pretty_generate(files.to_h)}</pre>"
end

get '/oauth2callback' do
  client_secrets = Google::APIClient::ClientSecrets.load
  auth_client = client_secrets.to_authorization
  auth_client.update!(
    :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
    :redirect_uri => url('/oauth2callback'))
  if request['code'] == nil
    auth_uri = auth_client.authorization_uri.to_s
    redirect to(auth_uri)
  else
    auth_client.code = request['code']
    auth_client.fetch_access_token!
    auth_client.client_secret = nil
    session[:credentials] = auth_client.to_json
    redirect to('/')
  end
end

Node.js

Per eseguire questo esempio:

  1. In API Console, aggiungi l'URL della macchina locale all'elenco degli URL di reindirizzamento, ad esempio http://localhost.
  2. Assicurati di avere installato l'LTS di manutenzione, l'LTS attivo o la release corrente di Node.js.
  3. Crea una nuova directory e modificala. Ad esempio:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
  5. Crea i file main.js con i contenuti seguenti.
  6. Esegui l'esempio:
    node .\main.js

main.js

const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI.
 * To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

/* Global variable that stores user credential in this code example.
 * ACTION ITEM for developers:
 *   Store user's refresh token in your data store if
 *   incorporating this code into your real app.
 *   For more information on handling refresh tokens,
 *   see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens
 */
let userCredential = null;

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to Google's OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }

    // Receive the callback from Google's OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) { // An error response e.g. error=access_denied
        console.log('Error:' + q.error);
      } else { // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        /** Save credential to the global variable in case access token was refreshed.
          * ACTION ITEM: In a production app, you likely want to save the refresh token
          *              in a secure persistent database instead. */
        userCredential = tokens;

        // Example of using Google Drive API to list filenames in user's Drive.
        const drive = google.drive('v3');
        drive.files.list({
          auth: oauth2Client,
          pageSize: 10,
          fields: 'nextPageToken, files(id, name)',
        }, (err1, res1) => {
          if (err1) return console.log('The API returned an error: ' + err1);
          const files = res1.data.files;
          if (files.length) {
            console.log('Files:');
            files.map((file) => {
              console.log(`${file.name} (${file.id})`);
            });
          } else {
            console.log('No files found.');
          }
        });
      }
    }

    // Example on revoking a token
    if (req.url == '/revoke') {
      // Build the string for the POST request
      let postData = "token=" + userCredential.access_token;

      // Options for POST request to Google's OAuth 2.0 server to revoke a token
      let postOptions = {
        host: 'oauth2.googleapis.com',
        port: '443',
        path: '/revoke',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(postData)
        }
      };

      // Set up the request
      const postReq = https.request(postOptions, function (res) {
        res.setEncoding('utf8');
        res.on('data', d => {
          console.log('Response: ' + d);
        });
      });

      postReq.on('error', error => {
        console.log(error)
      });

      // Post the request with data
      postReq.write(postData);
      postReq.end();
    }
    res.end();
  }).listen(80);
}
main().catch(console.error);

HTTP/REST

Questo esempio Python utilizza il framework Flask e la libreria Requests per dimostrare il flusso web OAuth 2.0. Per questo flusso, ti consigliamo di utilizzare la libreria client delle API di Google per Python. (l'esempio nella scheda Python utilizza la libreria client).

import json

import flask
import requests


app = flask.Flask(__name__)

CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123'  # Read from a file or environmental variable in a real app
SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly'
REDIRECT_URI = 'http://example.com/oauth2callback'


@app.route('/')
def index():
  if 'credentials' not in flask.session:
    return flask.redirect(flask.url_for('oauth2callback'))
  credentials = json.loads(flask.session['credentials'])
  if credentials['expires_in'] <= 0:
    return flask.redirect(flask.url_for('oauth2callback'))
  else:
    headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
    req_uri = 'https://www.googleapis.com/drive/v2/files'
    r = requests.get(req_uri, headers=headers)
    return r.text


@app.route('/oauth2callback')
def oauth2callback():
  if 'code' not in flask.request.args:
    auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
                '&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE)
    return flask.redirect(auth_uri)
  else:
    auth_code = flask.request.args.get('code')
    data = {'code': auth_code,
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'redirect_uri': REDIRECT_URI,
            'grant_type': 'authorization_code'}
    r = requests.post('https://oauth2.googleapis.com/token', data=data)
    flask.session['credentials'] = r.text
    return flask.redirect(flask.url_for('index'))


if __name__ == '__main__':
  import uuid
  app.secret_key = str(uuid.uuid4())
  app.debug = False
  app.run()

Regole di convalida URI di reindirizzamento

Google applica le seguenti regole di convalida al reindirizzamento degli URI per aiutare gli sviluppatori a proteggere le loro applicazioni. Gli URI di reindirizzamento devono rispettare queste regole. Consulta la sezione 3 di RFC 3986 per la definizione di dominio, host, percorso, query, schema e informazioni utente, citata di seguito.

Regole di convalida
Schema

Gli URI di reindirizzamento devono utilizzare lo schema HTTPS, non HTTP semplice. Gli URI localhost (inclusi gli URI degli indirizzi IP localhost) sono esenti da questa regola.

Organizzatore

Gli host non possono essere indirizzi IP non elaborati. Gli indirizzi IP Localhost sono esentati da questa regola.

Dominio
  • I domini di primo livello host (domini di primo livello) devono appartenere all'elenco dei suffissi pubblici.
  • I domini host non possono essere “googleusercontent.com”.
  • Gli URI di reindirizzamento non possono contenere domini abbreviatori di URL (ad esempio goo.gl), a meno che l'app non sia proprietaria del dominio. Inoltre, se un'app che possiede un dominio abbreviato sceglie di reindirizzare a quel dominio, l'URI di reindirizzamento deve contenere “/google-callback/” nel suo percorso o terminare con “/google-callback”.
  • Informazioni utente

    Gli URI di reindirizzamento non possono contenere il sottocomponente userinfo.

    Percorso

    Gli URI di reindirizzamento non possono contenere un attraversamento del percorso (chiamato anche backback della directory), rappresentato da un “/..” o “\..” o dalla relativa codifica dell'URL.

    Query

    Gli URI di reindirizzamento non possono contenere reindirizzamenti aperti.

    Frammento

    Gli URI di reindirizzamento non possono contenere il componente Frammento.

    Caratteri Gli URI di reindirizzamento non possono contenere determinati caratteri, tra cui:
    • Caratteri jolly ('*')
    • Caratteri ASCII non stampabili
    • Codifiche percentuali non valide (qualsiasi codifica percentuale che non segue la forma di codifica degli URL di un segno percentuale seguito da due cifre esadecimali)
    • Caratteri null (un carattere NULL codificato, ad es. %00, %C0%80)

    Autorizzazione incrementale

    Nel protocollo OAuth 2.0, la tua app richiede l'autorizzazione ad accedere alle risorse, identificate dagli ambiti. È considerata una best practice per l'esperienza utente richiedere l'autorizzazione delle risorse nel momento in cui ne hai bisogno. Per abilitare questa pratica, il server di autorizzazione di Google supporta le autorizzazioni incrementali. Questa funzionalità consente di richiedere ambiti in base alle esigenze e, se l'utente concede l'autorizzazione per il nuovo ambito, restituisce un codice di autorizzazione che può essere scambiato con un token contenente tutti gli ambiti che l'utente ha concesso al progetto.

    Ad esempio, un'app che consente agli utenti di campionare tracce musicali e creare mix potrebbe richiedere pochissime risorse al momento dell'accesso, forse solo il nome della persona che esegue l'accesso. Tuttavia, il salvataggio di un mix completato richiederebbe l'accesso al proprio Google Drive. Per la maggior parte delle persone, la soluzione sarebbe stata naturale se fosse stato richiesto l'accesso solo a Google Drive nel momento in cui l'app ne avesse effettivamente bisogno.

    In questo caso, al momento dell'accesso l'app potrebbe richiedere gli ambiti openid e profile per eseguire l'accesso di base, quindi richiedere l'ambito https://www.googleapis.com/auth/drive.file al momento della prima richiesta per salvare un mix.

    Per implementare l'autorizzazione incrementale, devi completare il normale flusso per richiedere un token di accesso, ma assicurati che la richiesta di autorizzazione includa ambiti concessi in precedenza. Questo approccio consente all'app di evitare di dover gestire più token di accesso.

    A un token di accesso ottenuto da un'autorizzazione incrementale si applicano le seguenti regole:

    • Il token può essere utilizzato per accedere alle risorse corrispondenti a uno qualsiasi degli ambiti inseriti nella nuova autorizzazione combinata.
    • Quando utilizzi il token di aggiornamento dell'autorizzazione combinata per ottenere un token di accesso, questo rappresenta l'autorizzazione combinata e può essere utilizzato per uno qualsiasi dei valori scope inclusi nella risposta.
    • L'autorizzazione combinata include tutti gli ambiti che l'utente ha concesso al progetto API anche se la concessione è stata richiesta da client diversi. Ad esempio, se un utente ha concesso l'accesso a un ambito utilizzando un client desktop di un'applicazione e poi ha concesso un altro ambito alla stessa applicazione tramite un client per dispositivi mobili, l'autorizzazione combinata includerà entrambi gli ambiti.
    • Se revochi un token che rappresenta un'autorizzazione combinata, l'accesso a tutti gli ambiti di tale autorizzazione per conto dell'utente associato viene revocato contemporaneamente.

    Gli esempi di codice specifici per il linguaggio nel Passaggio 1: impostare i parametri di autorizzazione e l'URL di reindirizzamento HTTP/REST di esempio nel Passaggio 2: reindirizzamento al server OAuth 2.0 di Google utilizzano tutti l'autorizzazione incrementale. Gli esempi di codice riportati di seguito mostrano anche il codice che devi aggiungere per utilizzare l'autorizzazione incrementale.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    In Python, imposta l'argomento della parola chiave include_granted_scopes su true per assicurarti che una richiesta di autorizzazione includa ambiti concessi in precedenza. È possibile che include_granted_scopes non sia l'unico argomento a parola chiave che hai impostato, come mostrato nell'esempio di seguito.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Ruby

    auth_client.update!(
      :additional_parameters => {"include_granted_scopes" => "true"}
    )

    Node.js

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    HTTP/REST

    GET https://accounts.google.com/o/oauth2/v2/auth?
      client_id=your_client_id&
      response_type=code&
      state=state_parameter_passthrough_value&
      scope=https%3A//www.googleapis.com/auth/drive.file&
      redirect_uri=https%3A//oauth2.example.com/code&
      prompt=consent&
      include_granted_scopes=true

    Aggiornamento di un token di accesso (accesso offline)

    I token di accesso scadono periodicamente e diventano credenziali non valide per una richiesta API correlata. Se hai richiesto l'accesso offline agli ambiti associati al token, puoi aggiornare un token di accesso senza chiedere l'autorizzazione all'utente (incluso quando l'utente non è presente).

    • Se utilizzi una libreria client delle API di Google, l'oggetto client aggiorna il token di accesso in base alle esigenze, purché configuri l'oggetto per l'accesso offline.
    • Se non utilizzi una libreria client, devi impostare il parametro di ricerca HTTP access_type su offline quando reindirizzi l'utente al server OAuth 2.0 di Google. In questo caso, il server di autorizzazione di Google restituisce un token di aggiornamento quando scambi un codice di autorizzazione con un token di accesso. Quindi, se il token di accesso scade (o in qualsiasi altro momento), puoi utilizzare un token di aggiornamento per ottenere un nuovo token di accesso.

    La richiesta dell'accesso offline è un requisito per qualsiasi applicazione che deve accedere a un'API Google quando l'utente non è presente. Ad esempio, un'app che esegue servizi di backup o esegue azioni in orari predeterminati deve essere in grado di aggiornare il token di accesso quando l'utente non è presente. Lo stile di accesso predefinito è denominato online.

    Le applicazioni web lato server, le applicazioni installate e i dispositivi ricevono token di aggiornamento durante il processo di autorizzazione. I token di aggiornamento non vengono generalmente utilizzati nelle applicazioni web lato client (JavaScript).

    PHP

    Se la tua applicazione richiede l'accesso offline a un'API Google, imposta il tipo di accesso del client API su offline:

    $client->setAccessType("offline");

    Dopo che un utente ha concesso l'accesso offline agli ambiti richiesti, puoi continuare a utilizzare il client API per accedere alle API di Google per conto dell'utente quando l'utente è offline. L'oggetto client aggiornerà il token di accesso in base alle esigenze.

    Python

    In Python, imposta l'argomento access_type della parola chiave su offline per assicurarti di poter aggiornare il token di accesso senza dover chiedere nuovamente all'utente l'autorizzazione. È possibile che access_type non sia l'unico argomento di parola chiave che hai impostato, come mostrato nell'esempio di seguito.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Dopo che un utente ha concesso l'accesso offline agli ambiti richiesti, puoi continuare a utilizzare il client API per accedere alle API di Google per conto dell'utente quando l'utente è offline. L'oggetto client aggiornerà il token di accesso in base alle esigenze.

    Ruby

    Se la tua applicazione richiede l'accesso offline a un'API Google, imposta il tipo di accesso del client API su offline:

    auth_client.update!(
      :additional_parameters => {"access_type" => "offline"}
    )

    Dopo che un utente ha concesso l'accesso offline agli ambiti richiesti, puoi continuare a utilizzare il client API per accedere alle API di Google per conto dell'utente quando l'utente è offline. L'oggetto client aggiornerà il token di accesso in base alle esigenze.

    Node.js

    Se la tua applicazione richiede l'accesso offline a un'API Google, imposta il tipo di accesso del client API su offline:

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    Dopo che un utente ha concesso l'accesso offline agli ambiti richiesti, puoi continuare a utilizzare il client API per accedere alle API di Google per conto dell'utente quando l'utente è offline. L'oggetto client aggiornerà il token di accesso in base alle esigenze.

    I token di accesso scadono. Questa libreria utilizzerà automaticamente un token di aggiornamento per ottenere un nuovo token di accesso se sta per scadere. Un modo semplice per assicurarti di archiviare sempre i token più recenti è utilizzare l'evento token:

    oauth2Client.on('tokens', (tokens) => {
      if (tokens.refresh_token) {
        // store the refresh_token in your secure persistent database
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
    });

    Questo evento dei token si verifica solo nella prima autorizzazione e devi aver impostato access_type su offline quando chiami il metodo generateAuthUrl per ricevere il token di aggiornamento. Se hai già concesso alla tua app le autorizzazioni richieste senza impostare i vincoli appropriati per ricevere un token di aggiornamento, dovrai autorizzare nuovamente l'applicazione per ricevere un nuovo token di aggiornamento.

    Per impostare refresh_token in un secondo momento, puoi utilizzare il metodo setCredentials:

    oauth2Client.setCredentials({
      refresh_token: `STORED_REFRESH_TOKEN`
    });
    

    Quando il client dispone di un token di aggiornamento, i token di accesso vengono acquisiti e aggiornati automaticamente nella chiamata successiva all'API.

    HTTP/REST

    Per aggiornare un token di accesso, l'applicazione invia una richiesta HTTPS POST al server di autorizzazione di Google (https://oauth2.googleapis.com/token) che include i seguenti parametri:

    Campi
    client_id L'ID client ottenuto da API Console.
    client_secret Il client secret ottenuto da API Console.
    grant_type Come definito nella specifica OAuth 2.0, il valore di questo campo deve essere impostato su refresh_token.
    refresh_token Il token di aggiornamento restituito dallo scambio di codice di autorizzazione.

    Lo snippet che segue mostra una richiesta di esempio:

    POST /token HTTP/1.1
    Host: oauth2.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=your_client_id&
    client_secret=your_client_secret&
    refresh_token=refresh_token&
    grant_type=refresh_token

    Se l'utente non ha revocato l'accesso concesso all'applicazione, il server token restituisce un oggetto JSON contenente un nuovo token di accesso. Il seguente snippet mostra una risposta di esempio:

    {
      "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
      "expires_in": 3920,
      "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
      "token_type": "Bearer"
    }

    Tieni presente che sono previsti limiti al numero di token di aggiornamento che verranno emessi; un limite per combinazione client/utente e un altro per utente per tutti i client. Salva i token di aggiornamento nello spazio di archiviazione a lungo termine e continua a utilizzarli finché rimangono validi. Se la tua applicazione richiede troppi token di aggiornamento, potrebbero imbattersi in questi limiti e, in tal caso, i token di aggiornamento meno recenti smetteranno di funzionare.

    Revoca di un token

    In alcuni casi, un utente potrebbe voler revocare l'accesso concesso a un'applicazione. Un utente può revocare l'accesso dalla pagina Impostazioni account. Per saperne di più, consulta la sezione Rimuovere l'accesso ai siti o alle app nei siti di terze parti e nelle app con accesso al tuo account.

    È anche possibile che un'applicazione revochi in modo programmatico l'accesso assegnato all'applicazione. La revoca programmatica è importante nei casi in cui un utente annulla l'iscrizione, rimuove un'applicazione o le risorse API richieste da un'app sono cambiate in modo significativo. In altre parole, una parte del processo di rimozione può includere una richiesta API per garantire che le autorizzazioni concesse in precedenza all'applicazione vengano rimosse.

    PHP

    Per revocare in modo programmatico un token, chiama revokeToken():

    $client->revokeToken();

    Python

    Per revocare in modo programmatico un token, invia a https://oauth2.googleapis.com/revoke una richiesta che includa il token come parametro e imposti l'intestazione Content-Type:

    requests.post('https://oauth2.googleapis.com/revoke',
        params={'token': credentials.token},
        headers = {'content-type': 'application/x-www-form-urlencoded'})

    Ruby

    Per revocare in modo programmatico un token, effettua una richiesta HTTP all'endpoint oauth2.revoke:

    uri = URI('https://oauth2.googleapis.com/revoke')
    response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
    

    Il token può essere un token di accesso o un token di aggiornamento. Se il token è un token di accesso e ha un token di aggiornamento corrispondente, anche il token di aggiornamento verrà revocato.

    Se la revoca è stata elaborata correttamente, il codice di stato della risposta è 200. Per le condizioni di errore, viene restituito un codice di stato 400 insieme a un codice di errore.

    Node.js

    Per revocare in modo programmatico un token, effettua una richiesta POST HTTPS all'endpoint /revoke:

    const https = require('https');
    
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;
    
    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    
    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });
    
    postReq.on('error', error => {
      console.log(error)
    });
    
    // Post the request with data
    postReq.write(postData);
    postReq.end();
    

    Il parametro token può essere un token di accesso o un token di aggiornamento. Se il token è un token di accesso e ha un token di aggiornamento corrispondente, anche il token di aggiornamento verrà revocato.

    Se la revoca è stata elaborata correttamente, il codice di stato della risposta è 200. Per le condizioni di errore, viene restituito un codice di stato 400 insieme a un codice di errore.

    HTTP/REST

    Per revocare un token in modo programmatico, l'applicazione effettua una richiesta a https://oauth2.googleapis.com/revoke e include il token come parametro:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    Il token può essere un token di accesso o un token di aggiornamento. Se il token è un token di accesso e ha un token di aggiornamento corrispondente, anche il token di aggiornamento verrà revocato.

    Se la revoca viene elaborata correttamente, il codice di stato HTTP della risposta è 200. Per le condizioni di errore, viene restituito un codice di stato HTTP 400 insieme a un codice di errore.