Collegamento dell'account con OAuth

Il tipo di collegamento OAuth supporta due flussi OAuth 2.0 standard di settore: i flussi di codice implicito e di autorizzazione.

Nel flusso del codice implicito, Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Dopo aver eseguito l'accesso, restituisci a Google un token di accesso di lunga durata. Questo token di accesso è ora incluso in ogni richiesta inviata dall'assistente alla tua azione.

Nel flusso del codice di autorizzazione, sono necessari due endpoint:

  • L'endpoint di autorizzazione, che è responsabile della presentazione dell'interfaccia utente di accesso agli utenti che non hanno ancora eseguito l'accesso, nonché della registrazione del consenso all'accesso richiesto sotto forma di codice di autorizzazione di breve durata.
  • L'endpoint token scambio, che è responsabile di due tipi di scambi:
    1. Scambia un codice di autorizzazione con un token di aggiornamento di lunga durata e un token di accesso di breve durata. Questo scambio avviene quando l'utente esegue il flusso di collegamento dell'account.
    2. Scambia un token di aggiornamento di lunga durata con un token di accesso di breve durata. Questa piattaforma di scambio avviene quando Google ha bisogno di un nuovo token di accesso perché quello scaduto.

Anche se il flusso del codice implicito è più facile da implementare, Google consiglia che i token di accesso emessi utilizzando il flusso implicito non scadano mai, perché l'uso della scadenza del token con il flusso implicito obbliga l'utente a collegare di nuovo il proprio account. Se per motivi di sicurezza è necessaria la scadenza del token, ti consigliamo di utilizzare il flusso del codice di autenticazione.

Implementare il collegamento degli account OAuth

Configura il progetto

Per configurare il progetto per l'utilizzo del collegamento OAuth, segui questi passaggi:

  1. Apri la console di Actions e seleziona il progetto che vuoi utilizzare.
  2. Fai clic sulla scheda Sviluppo e scegli Collegamento dell'account.
  3. Attiva l'opzione Collegamento dell'account.
  4. Nella sezione Creazione account, seleziona No, voglio consentire la creazione di account solo sul mio sito web.
  5. In Tipo di collegamento, seleziona OAuth e Codice di autorizzazione.

  6. 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.
  1. Fai clic su Salva.

Implementare il server OAuth

L'implementazione del flusso del codice di autorizzazione sul server OAuth 2.0 è composta da due endpoint, che il tuo servizio rende disponibili tramite HTTPS. Il primo endpoint è l'endpoint di autorizzazione, responsabile per trovare o ottenere il consenso degli utenti per l'accesso ai dati. L'endpoint di autorizzazione presenta una UI di accesso agli utenti che non hanno ancora effettuato l'accesso e registra il consenso per l'accesso richiesto. Il secondo endpoint è l'endpoint di scambio di token, che viene utilizzato per ottenere stringhe criptate chiamate token che autorizzano l'utente dell'azione ad accedere al servizio.

Quando l'Azione deve chiamare una delle API del tuo servizio, Google utilizza questi endpoint insieme per ottenere l'autorizzazione dagli utenti a chiamare queste API per loro conto.

La sessione del flusso del codice di autorizzazione OAuth 2.0 avviata da Google ha il seguente flusso:

  1. Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Se il flusso iniziato su un dispositivo solo vocale per un'Azione, Google trasferirà l'esecuzione su un telefono.
  2. L'utente esegue l'accesso (se non ha già eseguito l'accesso) e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API, se non l'ha già fatto.

  3. Il servizio crea un codice di autorizzazione e lo restituisce a Google reindirizzando il browser dell'utente a Google con il codice di autorizzazione allegato alla richiesta.

  4. Google invia il codice di autorizzazione all'endpoint di scambio di token che verifica 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 lunga durata che Google può archiviare e utilizzare per acquisire nuovi token di accesso alla scadenza.

  5. Dopo che l'utente ha completato il flusso di collegamento dell'account, ogni richiesta successiva 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 flusso del codice di autorizzazione OAuth 2.0, Google invia l'utente all'endpoint di autorizzazione con una richiesta che include i seguenti parametri:

Parametri endpoint di autorizzazione
client_id L'ID client Google che hai registrato con Google.
redirect_uri L'URL a cui invii la risposta a questa richiesta.
state Un valore contabile che viene restituito a Google e invariato nell'URI di reindirizzamento.
scope Facoltativo: un insieme di stringhe di ambito delimitato da spazi che specificano i dati per i quali Google richiede l'autorizzazione.
response_type La stringa code.

Ad esempio, se il tuo endpoint di autorizzazione è disponibile all'indirizzo https://myservice.example.com/auth, una richiesta potrebbe essere simile a:

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é il tuo endpoint di autorizzazione possa gestire le richieste di accesso:

  1. Verifica che client_id corrisponda all'ID client Google che hai registrato con Google e che redirect_uri corrisponda all'URL di reindirizzamento fornito da Google per il servizio. Questi controlli sono importanti per impedire di concedere l'accesso ad app client non intenzionali o configurate in modo errato.

    Se supporti più flussi OAuth 2.0, verifica inoltre che response_type sia code.

  2. Controlla se l'utente ha eseguito l'accesso al servizio. Se l'utente non ha eseguito l'accesso, completa il flusso di accesso o registrazione del servizio.

  3. Genera un codice di autorizzazione che Google utilizzerà per accedere alla tua API. Il codice di autorizzazione può essere qualsiasi valore stringa, ma deve rappresentare in modo univoco l'utente, il client a cui è destinato il token e la data di scadenza del codice e non deve essere intuibile. In genere vengono emessi codici di autorizzazione che scadono dopo circa 10 minuti.

  4. Verifica che l'URL specificato dal parametro redirect_uri abbia il formato seguente:

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
    YOUR_PROJECT_ID è l'ID che si trova nella pagina Impostazioni progetto di Actions Console.

  5. Reindirizza il browser dell'utente all'URL specificato dal parametro redirect_uri. Includi il codice di autorizzazione appena generato e il valore dello stato originale non modificato quando esegui il reindirizzamento aggiungendo i parametri code e state. 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 servizio è responsabile di due tipi di scambi di token:

  • 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 degli endpoint per lo scambio di token
client_id Una stringa che identifica l'origine della richiesta come Google. Questa stringa deve essere registrata all'interno del tuo sistema come identificatore univoco di Google.
client_secret Una stringa segreta registrata con Google per il tuo servizio.
grant_type Il tipo di token che viene scambiato. authorization_code o refresh_token.
code Quando grant_type=authorization_code, il codice che Google ha ricevuto dall'endpoint di accesso o di scambio di token.
redirect_uri Quando grant_type=authorization_code, questo parametro è l'URL utilizzato nella richiesta di autorizzazione iniziale.
refresh_token Quando grant_type=refresh_token, il token di aggiornamento che Google ha 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 a Google un codice di autorizzazione di breve durata, Google invia una richiesta all'endpoint di scambio di token per scambiare il codice di autorizzazione con 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 di scambio di un codice di autorizzazione per un token 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 di token Exchange risponde alle richieste POST che eseguono i seguenti passaggi:

  1. Verifica che client_id identifichi l'origine della richiesta come un'origine autorizzata e che client_secret corrisponda al valore previsto.
  2. Verifica quanto segue:
    • Il codice di autorizzazione è valido e non è scaduto e l'ID client 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.
  3. Se non riesci a verificare tutti i criteri precedenti, restituisci un errore HTTP 400 Bad Request con {"error": "invalid_grant"} come corpo.
  4. In caso contrario, utilizzando l'ID utente del codice di autorizzazione, genera un token di 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 si riferisce il token e non devono essere intuibili. Per i token di accesso, registra anche la data di scadenza (in genere un'ora dopo l'emissione). I token di aggiornamento non hanno scadenza.
  5. 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 per l'utente e ne registra la scadenza. Quando il token di accesso scade, Google utilizza il token di aggiornamento per ricevere un nuovo token di accesso dall'endpoint di scambio dei 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 dei 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 di 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 di token risponde alle richieste POST che eseguono i seguenti passaggi:

  1. Verifica che client_id identifichi l'origine della richiesta come Google e che client_secret corrisponda al valore previsto.
  2. Verifica che il token di aggiornamento sia valido e che l'ID client specificato nella richiesta corrisponda all'ID client associato al token di aggiornamento.
  3. Se non riesci a verificare tutti i criteri precedenti, restituisci un errore HTTP 400 Bad Request con {"error": "invalid_grant"} come corpo.
  4. In caso contrario, utilizza l'ID utente del token di aggiornamento per generare un token di accesso. I token possono essere qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client a cui si riferisce il token e non devono essere intuibili. Per i token di accesso, registra anche la data di scadenza (in genere un'ora dopo l'emissione).
  5. Restituisci il seguente oggetto JSON nel corpo della risposta HTTPS:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "expires_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

  1. Apri il progetto Actions Builder nella console di Actions.
  2. Crea una nuova scena per avviare il collegamento dell'account nell'Azione:
    1. Fai clic su Scene.
    2. Fai clic sull'icona Aggiungi (+) per aggiungere una nuova scena.
  3. Nella scena appena creata, fai clic sull'icona Aggiungi in Condizioni.
  4. 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.
    1. Nel campo Enter new expression in Condizione, inserisci la seguente logica: user.verificationStatus != "VERIFIED"
    2. 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.

  1. Fai clic sull'icona Aggiungi in Condizioni.
  2. Aggiungi una condizione per attivare un flusso di collegamento dell'account se all'utente non è associata un'identità.
    1. Nel campo Enter new expression in Condizione, inserisci la seguente logica: user.verificationStatus == "VERIFIED"
    2. In Transizione, seleziona la scena di sistema Collegamento dell'account.
    3. Fai clic su Salva.

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

  1. In Scene, seleziona la scena di sistema per il collegamento dell'account.
  2. 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").
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se l'utente completa correttamente il collegamento dell'account.
  2. 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.
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se l'utente annulla o ignora il collegamento dell'account.
  2. 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.
  3. Fai clic su Salva.

  1. In Condizioni, fai clic su Se si verifica un errore di sistema o di rete.
  2. 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.
  3. 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.