Questo documento spiega come 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 per 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 per archiviare i file sui propri Drive.
Questo flusso OAuth 2.0 è specifico per l'autorizzazione dell'utente. È progettato per le applicazioni che possono archiviare informazioni riservate e mantenere lo stato. Un'applicazione server web appropriata può accedere a un'API mentre l'utente interagisce con l'applicazione o dopo che l'ha abbandonata.
Le applicazioni server web usano spesso anche account di servizio per autorizzare le richieste API, in particolare quando si chiamano API Cloud per accedere ai dati basati sul progetto anziché a 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 per la lingua 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 della tua applicazione, quest'ultima 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 e quando l'applicazione deve ottenere di nuovo il consenso. La libreria client genera anche URL di reindirizzamento corretti e aiuta a implementare i gestori di reindirizzamento che scambiano i codici di autorizzazione con i token di accesso.
Le librerie client dell'API di Google per le applicazioni lato server sono disponibili per le seguenti lingue:
Prerequisiti
Abilita le API per il tuo progetto
Tutte le applicazioni che chiamano API di Google devono abilitarle nel API Console.
Per abilitare un'API per il progetto:
- Open the API Library in Google API Console.
- If prompted, select a project, or create a new one.
- L'elenco API Library elenca tutte le API disponibili, raggruppate per famiglia di prodotti e popolarità. Se l'API che vuoi attivare non è visibile nell'elenco, utilizza la funzionalità di ricerca per trovarla o fai clic su Visualizza tutto nella famiglia di prodotti a cui appartiene.
- Seleziona l'API che vuoi attivare, quindi fai clic sul pulsante Abilita.
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Crea credenziali di autorizzazione
Qualsiasi applicazione che utilizza OAuth 2.0 per accedere alle API di Google deve disporre di credenziali di autorizzazione che identificano il server OAuth 2.0 di Google. I passaggi seguenti spiegano come creare credenziali per il progetto. Le applicazioni possono quindi utilizzare le credenziali per accedere alle API che hai abilitato per il progetto.
- Go to the Credentials page.
- Fai clic su Crea credenziali > ID client OAuth.
- Seleziona il tipo di applicazione Applicazione web.
- 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 utilizzanohttp://localhost:8080
come URI di reindirizzamento.Ti consigliamo di progettare gli endpoint di autenticazione dell'app in modo che l'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 una posizione sicura e accessibile solo all'applicazione.
Identifica gli ambiti di accesso
Gli ambiti consentono alla tua applicazione di richiedere l'accesso solo alle risorse necessarie e di controllare agli utenti il livello di accesso concesso 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à avere accesso.
Consigliamo inoltre all'applicazione di richiedere 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 perché 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 o più 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, sono necessari:
- 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.
-
La 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, sono necessari:
- 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
egoogle-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, sono necessari:
- 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 di Sinatra Ruby.
gem install sinatra
Node.js
Per eseguire gli esempi di codice Node.js in questo documento, hai bisogno di:
- L'LTS di manutenzione, LTS attivo o la release corrente di Node.js.
-
Il client Node.js delle API di Google:
npm install googleapis
HTTP/REST
Non è necessario installare alcuna libreria per poter chiamare direttamente gli endpoint OAuth 2.0.
Ottenere i token di accesso OAuth 2.0
I passaggi seguenti mostrano come la tua applicazione interagisce con il server OAuth 2.0 di Google per ottenere il consenso di un utente per eseguire una richiesta API per suo conto. La tua applicazione deve avere questo consenso prima di poter eseguire una richiesta API di Google che richiede l'autorizzazione dell'utente.
L'elenco seguente riassume velocemente questi passaggi:
- L'applicazione identifica le autorizzazioni necessarie.
- L'applicazione reindirizza l'utente a Google insieme all'elenco delle autorizzazioni richieste.
- È l'utente a decidere se concedere le autorizzazioni alla tua applicazione.
- La tua applicazione scopre ciò che l'utente ha deciso.
- Se l'utente ha concesso le autorizzazioni richieste, l'applicazione recupera i token necessari per effettuare le 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 la tua applicazione e definiscono le autorizzazioni che verranno richieste all'utente.
- Se utilizzi una libreria client Google per l'autenticazione e l'autorizzazione OAuth 2.0, crei e configuri un oggetto che definisce questi parametri.
- Se chiami direttamente l'endpoint di Google OAuth 2.0, devi generare un URL e impostare i relativi parametri.
Le schede seguenti definiscono i parametri di autorizzazione supportati per le applicazioni server web. Gli esempi specifici per il linguaggio mostrano anche come utilizzare una libreria client o una libreria di autorizzazione 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.
L'oggetto 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 la tua 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 di 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. Questo valore è disponibile in Credentials page API Console. In PHP, chiama la funzione $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 Console
Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per Tieni presente che lo schema Per impostare questo valore in PHP, chiama la funzione $client->setRedirectUri('https://oauth2.example.com/code'); |
||||||
scope |
Obbligatorio
Un elenco di ambiti delimitato da spazi che identificano le risorse a cui la tua applicazione potrebbe accedere per conto dell'utente. Questi valori definiscono la schermata per il 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 il livello di accesso concesso all'applicazione. Pertanto, esiste 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 $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); Ti consigliamo di fare in modo che la tua applicazione richieda l'accesso agli ambiti di autorizzazione nel contesto ogni volta che è 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 ha bisogno dell'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 validi del parametro sono Imposta il valore su Per impostare questo valore in PHP, chiama la funzione $client->setAccessType('offline'); |
||||||
state |
Consigliato
Specifica qualsiasi valore stringa utilizzato dall'applicazione per mantenere lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione.
Il server restituisce l'esatto valore inviato come coppia Puoi utilizzare questo parametro per diversi scopi, ad esempio per indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare elementi nonce e mitigare la falsificazione di più siti. Poiché è possibile indovinare Per impostare questo valore in PHP, chiama la funzione $client->setState($sample_passthrough_value); |
||||||
include_granted_scopes |
Facoltativo
Consente alle applicazioni di utilizzare l'autorizzazione incrementale per richiedere l'accesso ad ambiti aggiuntivi nel contesto. Se imposti il valore di questo parametro su Per impostare questo valore in PHP, chiama la funzione $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 di autenticazione Google. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo dell'email nel modulo di accesso o selezionando la sessione di accesso multiplo appropriata. Imposta il valore del parametro su un indirizzo email o su un identificatore Per impostare questo valore in PHP, chiama la funzione $client->setLoginHint('None'); |
||||||
prompt |
Facoltativo
Un elenco di richieste di presentazione dell'utente, delimitati da maiuscole e minuscole. Se non specifichi questo parametro, all'utente verrà richiesto solo il primo accesso al progetto. Per saperne di più, consulta la sezione Richiesta del consenso. Per impostare questo valore in PHP, chiama la funzione $client->setApprovalPrompt('consent'); I valori possibili sono:
|
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 delle credenziali di autorizzazione. Questo oggetto identifica anche gli ambiti ai quali l'applicazione richiede l'autorizzazione di accesso 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 di 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. Questo valore è disponibile in Credentials page API Console. In Python, chiama il metodo 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 Console
Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per Tieni presente che lo schema Per impostare questo valore in Python, imposta la proprietà 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 definiscono la schermata per il 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 il livello di accesso concesso all'applicazione. Pertanto, esiste una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente. In Python, utilizza lo stesso metodo usato per impostare 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 fare in modo che la tua applicazione richieda l'accesso agli ambiti di autorizzazione nel contesto ogni volta che è 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 ha bisogno dell'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 validi del parametro sono Imposta il valore su In Python, imposta il parametro authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||
state |
Consigliato
Specifica qualsiasi valore stringa utilizzato dall'applicazione per mantenere lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione.
Il server restituisce l'esatto valore inviato come coppia Puoi utilizzare questo parametro per diversi scopi, ad esempio per indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare elementi nonce e mitigare la falsificazione di più siti. Poiché è possibile indovinare In Python, imposta il parametro 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 ambiti aggiuntivi nel contesto. Se imposti il valore di questo parametro su In Python, imposta il parametro 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 di autenticazione Google. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo dell'email nel modulo di accesso o selezionando la sessione di accesso multiplo appropriata. Imposta il valore del parametro su un indirizzo email o su un identificatore In Python, imposta il parametro authorization_url, state = flow.authorization_url( access_type='offline', login_hint='None', include_granted_scopes='true') |
||||||
prompt |
Facoltativo
Un elenco di richieste di presentazione dell'utente, delimitati da maiuscole e minuscole. Se non specifichi questo parametro, all'utente verrà richiesto solo il primo accesso al progetto. Per saperne di più, consulta la sezione Richiesta del consenso. In Python, imposta il parametro authorization_url, state = flow.authorization_url( access_type='offline', prompt='consent', include_granted_scopes='true') I valori possibili sono:
|
Ruby
Utilizza il file client_secrets.json creato per configurare un oggetto client nella tua applicazione. Quando configuri un oggetto client, devi specificare 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 di 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 per 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.
L'oggetto utilizza le informazioni del file client_secret.json per identificare la tua 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. Maggiori 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 del server web:
Parametri | |||||||
---|---|---|---|---|---|---|---|
client_id |
Obbligatorio
L'ID client della tua applicazione. Questo valore è disponibile in Credentials page API Console. |
||||||
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 Console
Credentials pagedel client. Se questo valore non corrisponde a un URI di reindirizzamento autorizzato per Tieni presente che lo schema |
||||||
response_type |
Obbligatorio
Determina se l'endpoint Google OAuth 2.0 restituisce un codice di autorizzazione. Imposta il valore del parametro su |
||||||
scope |
Obbligatorio
Un elenco di ambiti delimitato da spazi che identificano le risorse a cui la tua applicazione potrebbe accedere per conto dell'utente. Questi valori definiscono la schermata per il 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 il livello di accesso concesso all'applicazione. Pertanto, esiste una relazione inversa tra il numero di ambiti richiesti e la probabilità di ottenere il consenso dell'utente. Ti consigliamo di fare in modo che la tua applicazione richieda l'accesso agli ambiti di autorizzazione nel contesto ogni volta che è 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 ha bisogno dell'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 validi del parametro sono Imposta il valore su |
||||||
state |
Consigliato
Specifica qualsiasi valore stringa utilizzato dall'applicazione per mantenere lo stato tra la richiesta di autorizzazione e la risposta del server di autorizzazione.
Il server restituisce l'esatto valore inviato come coppia Puoi utilizzare questo parametro per diversi scopi, ad esempio per indirizzare l'utente alla risorsa corretta nella tua applicazione, inviare elementi nonce e mitigare la falsificazione di più siti. Poiché è possibile indovinare |
||||||
include_granted_scopes |
Facoltativo
Consente alle applicazioni di utilizzare l'autorizzazione incrementale per richiedere l'accesso ad ambiti aggiuntivi nel contesto. Se imposti il valore di questo parametro su |
||||||
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 di autenticazione Google. Il server utilizza il suggerimento per semplificare il flusso di accesso precompilando il campo dell'email nel modulo di accesso o selezionando la sessione di accesso multiplo appropriata. Imposta il valore del parametro su un indirizzo email o su un identificatore |
||||||
prompt |
Facoltativo
Un elenco di richieste di presentazione dell'utente, delimitati da maiuscole e minuscole. Se non specifichi questo parametro, all'utente verrà richiesto solo il primo accesso al progetto. Per saperne di più, consulta la sezione Richiesta del consenso. I valori possibili sono:
|
Passaggio 2: reindirizza al server OAuth 2.0 di Google
Reindirizza l'utente al server OAuth 2.0 di Google per avviare il processo di autenticazione e autorizzazione. In genere, questo si verifica quando la tua applicazione deve prima accedere ai dati dell'utente. In caso di autorizzazione incrementale, questo passaggio si verifica anche quando l'applicazione deve prima accedere a risorse aggiuntive alle quali non ha ancora accesso.
PHP
- Genera un URL per richiedere l'accesso al server OAuth 2.0 di Google:
$auth_url = $client->createAuthUrl();
- 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
- Genera un URL per richiedere l'accesso al server OAuth 2.0 di Google:
auth_uri = auth_client.authorization_uri.to_s
- Reindirizza l'utente a
auth_uri
.
Node.js
-
Utilizza l'URL generato
authorizationUrl
dal metodo Passaggio 1generateAuthUrl
per richiedere l'accesso al server OAuth 2.0 di Google. -
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, reindirizzalo all'utente.
Il server OAuth 2.0 di Google autentica l'utente e ottiene dall'utente il consenso della tua applicazione per accedere agli ambiti richiesti. La risposta viene inviata nuovamente alla tua applicazione utilizzando l'URL di reindirizzamento specificato.
Passaggio 3: Google chiede all'utente il consenso
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 per cui richiede l'accesso, con le credenziali di autorizzazione dell'utente e un riepilogo degli ambiti di accesso da concedere. L'utente può quindi concedere l'accesso a uno o più ambiti richiesti dalla tua applicazione o rifiutare la richiesta.
L'applicazione non deve fare nulla in questa fase in attesa della risposta dal server OAuth 2.0 di Google che indica se è stato concesso alcun accesso. Questa risposta è spiegata nel passaggio successivo.
Errori
Le richieste all'endpoint di autorizzazione OAuth 2.0 di Google potrebbero mostrare messaggi di errore rivolti all'utente anziché i flussi di autenticazione e autorizzazione previsti. Di seguito sono elencati i codici di errore comuni e le risoluzioni suggerite.
admin_policy_enforced
L'Account Google non può autorizzare uno o più ambiti richiesti a causa dei criteri del suo amministratore di Google Workspace. Consulta l'articolo del Centro assistenza per amministratori di Google Workspace Controllare quali app di terze parti e interne possono accedere ai dati di Google Workspace per maggiori informazioni su come un amministratore può limitare l'accesso a tutti gli ambiti o agli ambiti sensibili e con restrizioni fino a quando non viene concesso esplicitamente l'accesso al tuo ID client OAuth.
disallowed_useragent
L'endpoint di autorizzazione viene visualizzato all'interno di 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 usare invece librerie Android come Accedi con Google per Android o AppAuth per Android Foundation per Android.
Gli sviluppatori web potrebbero riscontrare questo errore quando un'app per 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 del browser predefinita. 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 OpenID Foundation
AppAuth per iOS.
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 Universal Links sia l'app del browser predefinita. Anche la libreria SFSafariViewController
è un'opzione supportata.
org_internal
L'ID client OAuth nella richiesta fa parte di un progetto che limita l'accesso agli Account Google in una organizzazione Google Cloud specifica. Per scoprire di più su questa opzione di configurazione, consulta la sezione Tipo di utente nell'articolo del Centro assistenza Configurare la schermata per il consenso OAuth.
invalid_client
Il client secret OAuth non è corretto. Esamina la configurazione del client OAuth, inclusi l'ID client e il secret utilizzati per questa richiesta.
invalid_grant
Durante l'aggiornamento di un token di accesso o l'utilizzo di un'autorizzazione incrementale, il token potrebbe essere scaduto o essere stato invalidato. Autentica di nuovo l'utente e chiedi il suo consenso per ottenere nuovi token. Se continui a visualizzare questo errore, assicurati che l'applicazione sia stata configurata correttamente e di utilizzare i token e i parametri corretti nella richiesta. Altrimenti, l'account utente potrebbe essere stato eliminato o disattivato.
redirect_uri_mismatch
Il redirect_uri
trasmesso nella richiesta di autorizzazione non corrisponde a un URI di reindirizzamento autorizzato per l'ID client OAuth. Esamina gli URI di reindirizzamento autorizzati in Google API Console Credentials page.
Il parametro redirect_uri
potrebbe fare riferimento al flusso OAuth fuori banda che è stato ritirato e non è più supportato. Consulta la guida alla migrazione per aggiornare l'integrazione.
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 contiene 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 del 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 per i 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, il sistema dovrebbe reindirizzarti a http://localhost/oauth2callback
, che probabilmente restituirà un errore di 404 NOT FOUND
a meno che la tua macchina locale non pubblichi un file a questo 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, usa 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. Utilizza quindi 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, usa 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, usa 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 dalla API Console Credentials page. |
code |
Il 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 i
client_id specificati. |
Il seguente snippet 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 imposta il parametro access_type
su offline
nella richiesta iniziale al 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 |
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 da access_token espressi come elenco di stringhe
delimitati da maiuscole e minuscole. |
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" }
Errori
Quando scambi il codice di autorizzazione per un token di accesso, potresti riscontrare il seguente errore anziché la risposta prevista. Di seguito sono elencati i codici di errore comuni e le risoluzioni suggerite.
invalid_grant
Il codice di autorizzazione fornito non è valido o è nel formato sbagliato. Richiedi un nuovo codice riavviando il processo OAuth per richiedere di nuovo il consenso all'utente.
Chiamata alle API di Google
PHP
Segui questi passaggi per utilizzare il token di accesso per chiamare le API di Google:
- Se devi applicare un token di accesso a un nuovo oggetto
Google\Client
, ad esempio se lo hai archiviato in una sessione utente, utilizza il metodosetAccessToken
:$client->setAccessToken($access_token);
- Creare un oggetto di servizio per l'API che vuoi chiamare. Puoi creare un oggetto di servizio fornendo 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);
- Inviare 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. Utilizzare le credenziali di autorizzazione specifiche dell'utente per creare un oggetto di servizio per l'API che vuoi chiamare, quindi utilizzare l'oggetto per effettuare richieste API autorizzate.
- Creare un oggetto di servizio per l'API che vuoi chiamare. Puoi creare un oggetto di servizio chiamando il metodo
build
della libreriagoogleapiclient.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)
- Inviare 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:
- Creare 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
- Imposta le credenziali sul servizio:
drive.authorization = auth_client
- Effettua 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, puoi fornire l'autorizzazione per i singoli metodi 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. L'applicazione può utilizzare il token per autorizzare le richieste API per conto di un determinato account utente o account di servizio. Creare 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 di intestazione HTTP Authorization
Bearer
. Quando possibile, è preferibile l'intestazione HTTP, perché 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 tue chiamate alle API di Google (ad esempio, quando chiamate l'API Drive Files).
Puoi provare tutte le API di Google e visualizzarne gli ambiti su OAuth 2.0 Playground.
Esempi HTTP GET
Una chiamata all'endpoint
drive.files
(l'API Drive File) utilizzando 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 intestazione HTTP (opzione preferita):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
In alternativa, l'opzione del parametro della stringa di query:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Completa esempio
L'esempio seguente stampa un elenco di file in formato JSON dal Google Drive dell'utente dopo che quest'ultimo si è autenticato e ha dato all'applicazione il consenso ad accedere ai metadati di Drive dell'utente.
PHP
Per eseguire questo esempio:
- In API Console, aggiungi l'URL della macchina locale all'elenco
degli URL di reindirizzamento, ad esempio
http://localhost:8080
. - Crea una nuova directory e modificala. Ad esempio:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- Installa la Google API Client Library per PHP utilizzando Composer:
composer require google/apiclient:^2.10
- Crea i file
index.php
eoauth2callback.php
con i contenuti seguenti. - Esegui l'esempio con un server web configurato per la gestione di 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
Indice.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. Esegue
un'applicazione web all'indirizzo http://localhost:8080
che ti 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. Se l'operazione ha 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.
- Revoca 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 per la tua app ha provato a eseguire una richiesta API in una nuova sessione. Inoltre, ti consente di vedere la risposta dell'API che la tua app riceverebbe se un utente aveva revocato le autorizzazioni concesse alla tua app e quest'ultima ha comunque tentato di 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:
-
Nel campo API Console, aggiungi l'URL della macchina locale all'elenco degli URL di reindirizzamento, ad esempio
http://localhost
. - Assicurati di aver installato LTS di manutenzione, LTS attivo o la release corrente di Node.js.
-
Crea una nuova directory e modificala. Ad esempio:
mkdir ~/nodejs-oauth2-example cd ~/nodejs-oauth2-example
-
Install the
Google API Client
Library
for Node.js using npm:
npm install googleapis
-
Crea i file
main.js
con i contenuti seguenti. -
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. Consigliamo di utilizzare la libreria client delle API di Google per Python per questo flusso. (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 per reindirizzare gli URI e aiutare gli sviluppatori a proteggere le proprie applicazioni. Gli URI di reindirizzamento devono rispettare queste regole. Consulta la sezione 3986 del documento RFC 3986 per la definizione di dominio, host, percorso, query, schema e userinfo, di seguito riportati.
Regole di convalida | |
---|---|
Schema |
Gli URI di reindirizzamento devono utilizzare lo schema HTTPS, non un semplice HTTP. Gli URI Localhost (inclusi gli URI IP localhost) sono esenti da questa regola. |
Host |
Gli host non possono essere indirizzi IP non elaborati. Gli indirizzi IP Localhost sono esenti da questa regola. |
Dominio |
“googleusercontent.com” .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 tale dominio, l'URI di reindirizzamento deve contenere “/google-callback/” nel relativo 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 di percorso (chiamato anche backback della directory),
rappresentato da un elemento |
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:
|
Autorizzazione incrementale
Nel protocollo OAuth 2.0, la tua app richiede l'autorizzazione per 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 tale pratica, il server di autorizzazione di Google supporta l'autorizzazione incrementale. Questa funzionalità consente di richiedere gli ambiti in base alle necessità 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 di campionare tracce musicali e creare mix potrebbe richiedere pochissime risorse al momento dell'accesso, forse solo il nome della persona che effettua l'accesso. Tuttavia, il salvataggio di un mix completato richiede l'accesso a Google Drive. Per la maggior parte delle persone sarebbe naturale se fosse stato loro richiesto di accedere a Google Drive nel momento in cui l'applicazione 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, per poi 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 flusso normale per richiedere un token di accesso, ma assicurati che la richiesta di autorizzazione includa gli ambiti concessi in precedenza. Questo approccio consente alla tua app di evitare di 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 qualsiasi ambito inserito nella nuova autorizzazione combinata.
- Quando utilizzi il token di aggiornamento per l'autorizzazione combinata per ottenere un token di accesso, questo
rappresenta l'autorizzazione combinata e può essere utilizzato per qualsiasi
valore
scope
incluso nella risposta. - L'autorizzazione combinata include tutti gli ambiti che l'utente ha concesso al progetto API anche se le concessioni sono state richieste da client diversi. Ad esempio, se un utente ha concesso l'accesso a un ambito utilizzando il 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.
Gli esempi di codice specifici per il linguaggio nel Passaggio 1: imposta i parametri di autorizzazione e l'URL di reindirizzamento HTTP/REST nel Passaggio 2: Reindirizza al server OAuth 2.0 di Google utilizzano tutti l'autorizzazione incrementale. Gli esempi di codice riportati di seguito mostrano anche il codice da 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 assegnati in precedenza. È possibile che include_granted_scopes
non sia l'unico argomento della parola chiave che hai impostato, come mostrato nell'esempio seguente.
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
Aggiornare un token di accesso (accesso offline)
I token di accesso scadono periodicamente e diventano credenziali non valide per una richiesta API correlata. Puoi aggiornare un token di accesso senza chiedere all'utente l'autorizzazione (anche quando non è presente) se hai richiesto l'accesso offline agli ambiti associati al token.
- 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
suoffline
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 ottenerne uno nuovo.
La richiesta dell'accesso offline è un requisito per tutte le applicazioni che devono accedere a un'API Google
quando l'utente non è presente. Ad esempio, un'app che esegue servizi di backup o esegue azioni in momenti prestabiliti deve poter aggiornare il token di accesso quando l'utente non è presente. Lo stile di accesso predefinito è online
.
Le applicazioni web lato server, le applicazioni installate e i dispositivi ricevono tutti 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 deve avere 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 necessità.
Python
In Python, imposta l'argomento della parola chiave access_type
su offline
per assicurarti di poter aggiornare il token di accesso senza dover chiedere nuovamente l'autorizzazione all'utente. È possibile che access_type
non sia l'unico argomento
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 necessità.
Ruby
Se la tua applicazione deve avere 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 necessità.
Node.js
Se la tua applicazione deve avere 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 necessità.
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 dei 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 di 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 necessarie senza impostare i vincoli appropriati per la ricezione di un token di aggiornamento, dovrai autorizzare nuovamente l'applicazione a 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` });
Una volta che il client dispone di un token di aggiornamento, i token di accesso verranno 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 dalla API Console. |
client_secret |
Il client secret ottenuto dalla 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. |
Il seguente snippet 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 ci sono limiti al numero di token di aggiornamento emessi; un limite per combinazione client/utente e un altro per utente in tutti i client. Consigliamo di salvare i token di aggiornamento nello spazio di archiviazione a lungo termine e di continuare a utilizzarli finché rimangono validi. Se la tua applicazione richiede troppi token di aggiornamento, è possibile che questi limiti vengano applicati, nel qual 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 scoprire di più, consulta la sezione Rimuovere l'accesso ai siti o alle app dei siti di terze parti e le app con accesso al tuo account.
È anche possibile che un'applicazione revoca l'accesso concesso in modo programmatico. 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 un token a livello di programmazione, chiama revokeToken()
:
$client->revokeToken();
Python
Per revocare un token in modo programmatico, effettua una richiesta a https://oauth2.googleapis.com/revoke
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 presenta un token di aggiornamento corrispondente, anche il token di aggiornamento verrà revocato.
Se la revoca viene elaborata correttamente, il codice di stato della risposta è 200
. Per le condizioni di errore, viene restituito un codice di stato 400
e 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 presenta un token di aggiornamento corrispondente, anche il token di aggiornamento verrà revocato.
Se la revoca viene elaborata correttamente, il codice di stato della risposta è 200
. Per le condizioni di errore, viene restituito un codice di stato 400
e un
codice di errore.
HTTP/REST
Per revocare un token in modo programmatico, l'applicazione invia 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 presenta 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
e un codice di errore.