Collegamento dell'account con Accedi con Google

Accedi con Google per l'assistente offre a utenti e sviluppatori l'esperienza utente più semplice e intuitiva sia per il collegamento che per la creazione di account. L'Azione può richiedere l'accesso al profilo Google dell'utente durante una conversazione, inclusi nome, indirizzo email e immagine del profilo dell'utente.

Le informazioni del profilo possono essere utilizzate per creare un'esperienza utente personalizzata nell'Azione. Se hai delle app su altre piattaforme che utilizzano Accedi con Google, puoi anche trovare l'account di un utente esistente e collegarlo, crearne uno nuovo e stabilire un canale di comunicazione diretto con l'utente.

Per eseguire il collegamento dell'account con Accedi con Google, chiedi all'utente di dare il consenso ad accedere al proprio profilo Google. Potrai quindi utilizzare le informazioni del suo profilo, ad esempio l'indirizzo email, per identificare l'utente nel tuo sistema.

Implementare il collegamento all'account Accedi con Google

Segui i passaggi nelle sezioni seguenti per aggiungere un account Accedi con Google collegato all'azione.

Configura il progetto

Per configurare il tuo progetto per l'utilizzo del collegamento dell'account Accedi con Google, segui questi passaggi:

  1. Apri la console di Actions e seleziona un progetto.
  2. Fai clic sulla scheda Sviluppo e scegli Collegamento dell'account.
  3. Attiva l'opzione Collegamento dell'account.
  4. Nella sezione Creazione account, seleziona .
  5. In Tipo di collegamento, seleziona Accedi con Google.

  6. Apri Informazioni sul cliente e prendi nota del valore dell'ID cliente emesso da Google per le tue Azioni.

  7. Fai clic su Salva.

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.

Accedere alle informazioni del profilo nel backend

Dopo che l'utente avrà autorizzato la tua azione ad accedere al proprio profilo Google, in ogni richiesta successiva all'azione riceverai un token ID Google contenente le informazioni del profilo Google dell'utente.

Per accedere alle informazioni del profilo dell'utente, devi prima convalidare e decodificare il token seguendo questi passaggi:

  1. Utilizza una libreria di decodifica JWT per la tua lingua per decodificare il token e usa le chiavi pubbliche di Google (disponibili in formato JWK o PEM) per verificare la firma del token.
  2. Verifica che l'emittente del token (campo iss nel token decodificato) sia https://accounts.google.com e che il pubblico (campo aud nel token decodificato) sia il valore dell'ID client emesso da Google per le tue azioni, assegnato al tuo progetto nella console di Actions.

Di seguito è riportato un esempio di token decodificato:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The token's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Client ID assigned to your Actions project
  "iat": 233366400,         // Unix timestamp of the token's creation time
  "exp": 233370000,         // Unix timestamp of the token's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "locale": "en_US"
}

Se utilizzi la libreria Actions on Google per Node.js, questa si occupa della convalida e della decodifica del token per tuo conto e ti concede l'accesso ai contenuti del profilo, come mostrato nei seguenti snippet di codice.

...
const app = conversation({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
...
// Invoked on successful completion of account linking flow, check if we need to
// create a Firebase user.
app.handle('linkAccount', async conv => {
  let payload = conv.headers.authorization;
  if (payload) {
  // Get UID for Firebase auth user using the email of the user
    const email = payload.email;
    if (!conv.user.params.uid && email) {
      try {
        conv.user.params.uid = (await auth.getUserByEmail(email)).uid;
      } catch (e) {
        if (e.code !== 'auth/user-not-found') {
          throw e;
        }
        // If the user is not found, create a new Firebase auth user
        // using the email obtained from Google Assistant
        conv.user.params.uid = (await auth.createUser({email})).uid;
      }
    }
  }
});

Gestire le richieste di accesso ai dati

Per gestire la richiesta di accesso ai dati, verifica che l'utente rivendicato dal token ID Google sia già presente nel database. Il seguente snippet di codice mostra un esempio di come verificare se in un database Firestore esistono già ordini per un utente:

...
app.handle('Place_Order', async conv => {
  const order = conv.session.params.order;
  const userDoc = dbs.user.doc(conv.user.params.uid);
  const orderHistory = userDoc.collection("orderHistory");
  if (orderHistory) {
    // Order history exists, so the user already placed an order.
    // Update counter for order type.
    await orderHistory.doc(order).update({ count: admin.firestore.FieldValue.increment(1)});
  } else {
    // First order they place
    await orderHistory.doc(order).set({ option: order, count: 1});
    options.forEach(opt => {
      if (opt != order) {
        orderHistory.doc(opt).set({ option: opt, count: 0});
      }
    });
  }
  return conv.add(`Your ${order} has been placed. ` +
      'Thanks for using Boba Bonanza, see you soon!');
});