Il tipo di collegamento OAuth supporta due flussi OAuth 2.0 standard di settore: i flussi di codice implicito e di autorizzazione.
In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.
In the authorization code flow, you need two endpoints:
- The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
- The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.
Implementare il collegamento degli account OAuth
Configura il progetto
Per configurare il progetto per l'utilizzo del collegamento OAuth, segui questi passaggi:
- Apri la console di Actions e seleziona il progetto che vuoi utilizzare.
- Fai clic sulla scheda Sviluppo e scegli Collegamento dell'account.
- Attiva l'opzione Collegamento dell'account.
- Nella sezione Creazione account, seleziona No, voglio consentire la creazione di account solo sul mio sito web.
In Tipo di collegamento, seleziona OAuth e Codice di autorizzazione.
In Informazioni sul cliente:
- Assegna un valore al Client-ID emesso dalle tue Azioni a Google per identificare le richieste provenienti da Google.
- Prendi nota del valore dell'ID cliente emesso da Google per le tue Azioni;
- Inserisci gli URL per gli endpoint di autorizzazione e di scambio dei token.
- Fai clic su Salva.
Implementare il server OAuth
Un'implementazione del server OAuth 2.0 del flusso del codice di autorizzazione è composta da due endpoint, che il tuo servizio rende disponibili tramite HTTPS. Il primo endpoint è l'endpoint di autorizzazione, responsabile di trovare il consenso degli utenti all'accesso ai dati. L'endpoint di autorizzazione presenta un accesso UI per gli utenti che non hanno ancora effettuato l'accesso e che registra il consenso per ha richiesto l'accesso. Il secondo endpoint è quello di scambio di token, utilizzate per ottenere stringhe criptate chiamate token che autorizzano l'utente dell'azione per accedere al tuo servizio.
Quando l'Azione deve chiamare una delle API del tuo servizio, Google utilizza queste per ottenere l'autorizzazione degli utenti a chiamare queste API sui propri per conto tuo.
La sessione di flusso del codice di autorizzazione OAuth 2.0 avviata da Google prevede il seguente flusso:
- Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Se il flusso avviato su un dispositivo con solo comandi vocali per un'azione, Google trasferirà o l'esecuzione di queste query a un telefono.
L'utente accede (se non ha già eseguito l'accesso) e concede a Google l'autorizzazione per accedere ai propri dati con la tua API, se non hanno già concesso l'autorizzazione.
Il servizio crea un codice di autorizzazione e lo restituisce a Google reindirizzando il browser dell'utente a Google con il codice di autorizzazione in allegato alla richiesta.
Google invia il codice di autorizzazione al tuo endpoint di scambio di token, che consente di verificare l'autenticità del codice e restituisce un token di accesso e un token di aggiornamento. Il token di accesso è un token di breve durata che il tuo servizio accetta come credenziali per accedere alle API. Il token di aggiornamento è un token di token che Google può archiviare e utilizzare per acquisire nuovi token di accesso quando scadono.
Dopo che l'utente ha completato il flusso di collegamento dell'account, ogni richiesta inviata dall'assistente al webhook di fulfillment contiene un token di accesso.
Gestire le richieste di autorizzazione
Quando l'azione deve eseguire il collegamento dell'account tramite un codice di autorizzazione OAuth 2.0 flusso di autorizzazione, Google invia l'utente al tuo endpoint di autorizzazione con una richiesta include i seguenti parametri:
Parametri endpoint di autorizzazione | |
---|---|
client_id |
L'ID cliente Google che hai registrato con Google. |
redirect_uri |
L'URL a cui invii la risposta a questa richiesta. |
state |
Un valore di riferimento che viene restituito a Google invariato nelle URI di reindirizzamento. |
scope |
Facoltativo: un insieme di stringhe di ambiti delimitati da spazi che specificano la i dati per i quali Google richiede l'autorizzazione. |
response_type |
La stringa code . |
Ad esempio, se l'endpoint di autorizzazione è disponibile all'indirizzo https://myservice.example.com/auth
,
una richiesta potrebbe avere il seguente aspetto:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
Affinché l'endpoint di autorizzazione possa gestire le richieste di accesso, segui questi passaggi:
Verifica che il
client_id
corrisponda all'ID cliente Google con cui hai effettuato la registrazione Google e cheredirect_uri
corrisponda all'URL di reindirizzamento fornito da Google per il tuo servizio. Questi controlli sono importanti per impedire la concessione dell'accesso a per app client indesiderate o configurate in modo errato.Se supporti più flussi OAuth 2.0, verifica anche che il parametro
response_type
ècode
.Verifica se l'utente ha eseguito l'accesso al tuo servizio. Se l'utente non ha eseguito l'accesso, completare la procedura di accesso o di registrazione al servizio.
Generare un codice di autorizzazione che Google utilizzerà per accedere all'API. Il codice di autorizzazione può essere qualsiasi valore stringa, ma deve essere univoco rappresentano l'utente, il client a cui è destinato il token e la scadenza del codice e non deve essere indovibile. Di solito concedi l'autorizzazione che scadono dopo circa 10 minuti.
Conferma che l'URL specificato dal parametro
redirect_uri
ha il seguente formato: YOUR_PROJECT_ID è l'ID trovato nella pagina Impostazioni progetto della console di Actions.https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
Reindirizza il browser dell'utente all'URL specificato nel Parametro
redirect_uri
. Includi il codice di autorizzazione appena generato e il valore originale dello stato non modificato quando reindirizzi aggiungendo i parametricode
estate
. Di seguito è riportato un esempio dell'URL risultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Gestire le richieste di scambio di token
L'endpoint di scambio di token del tuo servizio è responsabile di due tipi di token piattaforme di scambio pubblicitario:
- Scambia codici di autorizzazione con token di accesso e token di aggiornamento
- Scambia i token di aggiornamento per i token di accesso
Le richieste di scambio di token includono i seguenti parametri:
Parametri endpoint scambio di token | |
---|---|
client_id |
Una stringa che identifica l'origine della richiesta come Google. Questa stringa deve Essere registrato all'interno del sistema come identificatore univoco di Google. |
client_secret |
Una stringa segreta che hai registrato con Google per il tuo servizio. |
grant_type |
Il tipo di token che viene scambiato. Entrambi
authorization_code o refresh_token . |
code |
Quando grant_type=authorization_code , il codice Google
ricevuto dall'endpoint di accesso o di scambio di token. |
redirect_uri |
Quando grant_type=authorization_code , questo parametro è il valore
URL utilizzato nella richiesta di autorizzazione iniziale. |
refresh_token |
Quando grant_type=refresh_token , il token di aggiornamento Google
ricevuto dall'endpoint di scambio di token. |
Scambia codici di autorizzazione con token di accesso e token di aggiornamento
Dopo che l'utente ha eseguito l'accesso e l'endpoint di autorizzazione restituisce un'autorizzazione di breve durata a Google, Google invia una richiesta al tuo endpoint di scambio di token per il codice di autorizzazione per un token di accesso e un token di aggiornamento.
Per queste richieste, il valore di grant_type
è authorization_code
e il valore
di code
è il valore del codice di autorizzazione concesso in precedenza a Google.
Di seguito è riportato un esempio di richiesta per lo scambio di un codice di autorizzazione con un
di accesso e un token di aggiornamento:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
Per scambiare i codici di autorizzazione con un token di accesso e un token di aggiornamento,
L'endpoint dello scambio di token risponde alle richieste POST
che eseguono i seguenti passaggi:
- Verifica che
client_id
identifichi l'origine della richiesta come origine autorizzata, e checlient_secret
corrisponda al valore previsto. - Verifica quanto segue:
- Il codice di autorizzazione è valido, non è scaduto e il client L'ID specificato nella richiesta corrisponde all'ID client associato al codice di autorizzazione.
- L'URL specificato dal parametro
redirect_uri
è identico al valore utilizzato nella richiesta di autorizzazione iniziale.
- Se non riesci a verificare tutti i criteri precedenti, restituisci una richiesta HTTP
400 Errore di richiesta non valida con
{"error": "invalid_grant"}
come corpo. - Altrimenti, utilizzando l'ID utente del codice di autorizzazione, genera un aggiornamento e un token di accesso. Questi token possono essere qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client a cui è destinato il token e non devono ipotizzabile. Per i token di accesso, registra anche la data di scadenza del token (in genere un'ora dopo l'emissione del token). I token di aggiornamento non hanno scadenza.
- Restituisci il seguente oggetto JSON nel corpo della risposta HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google archivia il token di accesso e il token di aggiornamento dell'utente e registra la scadenza del token di accesso. Alla scadenza del token di accesso, Google utilizza l'aggiornamento per ottenere un nuovo token di accesso dall'endpoint di scambio di token.
Scambia i token di aggiornamento per i token di accesso
Quando un token di accesso scade, Google invia una richiesta all'endpoint di scambio di token per scambiare un token di aggiornamento con un nuovo token di accesso.
Per queste richieste, il valore di grant_type
è refresh_token
e il valore
di refresh_token
è il valore del token di aggiornamento che hai concesso in precedenza a Google.
Di seguito è riportato un esempio di richiesta per lo scambio di un token di aggiornamento con un
token di accesso:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Per scambiare un token di aggiornamento con un token di accesso, l'endpoint di scambio dei token
risponde alle richieste POST
eseguendo questi passaggi:
- Verifica che
client_id
identifichi l'origine della richiesta come Google e che il valoreclient_secret
corrisponda al valore previsto valore. - Verifica che il token di aggiornamento sia valido e che l'ID client specificato corrisponda all'ID client associato al token di aggiornamento.
- Se non riesci a verificare tutti i criteri precedenti, restituisci una richiesta HTTP
400 Errore di richiesta non valida con
{"error": "invalid_grant"}
come corpo. - In caso contrario, utilizza l'ID utente del token di aggiornamento per generare un accesso di accesso. Questi token possono essere qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client a cui è destinato il token e questi elementi non devono essere indovinabili. Per i token di accesso, registra anche la data di scadenza del token (in genere un'ora dopo l'emissione del token).
- Restituisci il seguente oggetto JSON nel corpo del file HTTPS
risposta:
{ "token_type": "Portatore", "access_token": "ACCESS_TOKEN", "scadenza_in": SECONDS_TO_EXPIRATION }
Progetta l'interfaccia utente vocale per il flusso di autenticazione
Controlla se l'utente è verificato e avvia la procedura di collegamento dell'account
- Apri il progetto Actions Builder nella console di Actions.
- Crea una nuova scena per avviare il collegamento dell'account nell'Azione:
- Fai clic su Scene.
- Fai clic sull'icona Aggiungi (+) per aggiungere una nuova scena.
- Nella scena appena creata, fai clic sull'icona Aggiungi add in Condizioni.
- Aggiungi una condizione che verifichi se l'utente associato alla conversazione è
un utente verificato. Se il controllo ha esito negativo, l'Azione non può eseguire il collegamento dell'account
durante la conversazione e dovrebbe fornire l'accesso a
funzionalità che non richiedono il collegamento dell'account.
- Nel campo
Enter new expression
in Condizione, inserisci la seguente logica:user.verificationStatus != "VERIFIED"
- In Transizione, seleziona una scena che non richieda il collegamento dell'account o che sia il punto di accesso alle funzionalità solo per gli ospiti.
- Nel campo
- Fai clic sull'icona Aggiungi add in Condizioni.
- Aggiungi una condizione per attivare un flusso di collegamento dell'account se all'utente non è associata un'identità.
- Nel campo
Enter new expression
in Condizione, inserisci la seguente logica:user.verificationStatus == "VERIFIED"
- In Transizione, seleziona la scena di sistema Collegamento dell'account.
- Fai clic su Salva.
- Nel campo
Dopo il salvataggio, al progetto viene aggiunta una nuova scena di sistema di collegamento dell'account denominata <SceneName>_AccountLinking
.
Personalizzare la scena di collegamento dell'account
- In Scene, seleziona la scena di sistema per il collegamento dell'account.
- Fai clic su Invia richiesta e aggiungi una breve frase per descrivere all'utente il motivo per cui l'Azione deve accedere alla sua identità (ad esempio "Per salvare le tue preferenze").
- Fai clic su Salva.
- In Condizioni, fai clic su Se l'utente completa correttamente il collegamento dell'account.
- Configura la procedura da seguire nel caso in cui l'utente accetti di collegare il suo account. Ad esempio, chiama il webhook per elaborare qualsiasi logica di business personalizzata richiesta e tornare alla scena di origine.
- Fai clic su Salva.
- In Condizioni, fai clic su Se l'utente annulla o ignora il collegamento dell'account.
- Configura la procedura da seguire nel flusso se l'utente non accetta di collegare il proprio account. Ad esempio, invia un messaggio di conferma e reindirizza a scene che offrono funzionalità che non richiedono il collegamento dell'account.
- Fai clic su Salva.
- In Condizioni, fai clic su Se si verifica un errore di sistema o di rete.
- Configura la procedura da seguire se non è possibile completare il flusso di collegamento dell'account a causa di errori di sistema o di rete. Ad esempio, invia un messaggio di conferma e reindirizza a scene che offrono funzionalità che non richiedono il collegamento dell'account.
- Fai clic su Salva.
Gestire le richieste di accesso ai dati
Se la richiesta dell'assistente contiene un token di accesso, verifica innanzitutto che il token di accesso sia valido (e non scaduto), quindi recupera l'account utente associato dal database.