Collegamento dell'account con OAuth (Dialogflow)

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 di account 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 Implicito.

  6. In Informazioni sul cliente:

    • Assegna un valore al Client-ID emesso dalle tue Azioni a Google per identificare le richieste provenienti da Google.
    • Inserisci gli URL per gli endpoint di autorizzazione e di scambio dei token.
  1. Fai clic su Salva.

Implementare il server OAuth

Per supportare il flusso implicito OAuth 2.0, il servizio rende disponibile un endpoint di autorizzazione tramite HTTPS. Questo endpoint è responsabile dell'autenticazione e dell'ottenimento del consenso degli utenti per l'accesso ai dati. L'endpoint di autorizzazione presenta un'UI di accesso agli utenti che non hanno ancora effettuato l'accesso e registra il consenso all'accesso richiesto.

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

Una tipica sessione di flusso implicito OAuth 2.0 avviata da Google prevede il seguente flusso:

  1. Google apre il tuo endpoint di autorizzazione nel browser dell'utente. L'utente esegue l'accesso se non ha già effettuato l'accesso e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API, se non l'ha già fatto.
  2. Il servizio crea un token di accesso e lo restituisce a Google reindirizzando il browser dell'utente a Google con il token di accesso allegato alla richiesta.
  3. Google chiama le API del tuo servizio e allega il token di accesso a ogni richiesta. Il servizio verifica che il token di accesso conceda a Google l'autorizzazione ad accedere all'API, quindi completa la chiamata API.

Gestire le richieste di autorizzazione

Quando l'Azione deve eseguire il collegamento dell'account tramite un flusso OAuth2 implicito, 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 che hai assegnato a 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.
response_type Il tipo di valore da restituire nella risposta. Per il flusso implicito OAuth 2.0, il tipo di risposta è sempre token.

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&response_type=token

Affinché il tuo endpoint di autorizzazione possa gestire le richieste di accesso:

  1. Verifica i valori client_id e redirect_uri per impedire di concedere l'accesso ad app client indesiderate o configurate in modo errato:

    • Verifica che client_id corrisponda all'ID client assegnato a Google.
    • 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.
  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 al servizio.

  3. Genera un token di accesso che Google utilizzerà per accedere alla tua API. Il token di accesso può essere qualsiasi valore stringa, ma deve rappresentare in modo univoco l'utente e il client a cui si riferisce il token e non deve essere intuibile.

  4. Invia una risposta HTTP che reindirizza il browser dell'utente all'URL specificato dal parametro redirect_uri. Includi tutti i seguenti parametri nel frammento di URL:

    • access_token: il token di accesso appena generato
    • token_type: la stringa bearer
    • state: il valore dello stato non modificato della richiesta originale Di seguito è riportato un esempio dell'URL risultante:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Il gestore del reindirizzamento OAuth 2.0 di Google riceverà il token di accesso e confermerà che il valore state non è cambiato. Dopo che Google avrà ottenuto un token di accesso per il tuo servizio, lo associa alle chiamate successive all'Azione nell'ambito di AppRequest.

Avvia il flusso di autenticazione

Utilizza l'intent helper per l'accesso all'account per avviare il flusso di autenticazione. Gli snippet di codice riportati di seguito descrivono come inviare una risposta in Dialogflow e nell'SDK Actions per utilizzare questo helper.

Dialogflow:

Node.js
const {dialogflow, SignIn} = require('actions-on-google');
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('Start Signin', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("Start Signin")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "PLACEHOLDER"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}",
      "systemIntent": {
        "intent": "actions.intent.SIGN_IN",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
          "optContext": "To get your account details"
        }
      }
    }
  },
  "outputContexts": [
    {
      "name": "/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{}"
      }
    }
  ]
}

SDK Actions:

Node.js
const {actionssdk, SignIn} = require('actions-on-google');
const app = actionssdk({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('actions.intent.TEXT', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "PLACEHOLDER"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.SIGN_IN",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
            "optContext": "To get your account details"
          }
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

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.