Associer des comptes avec Google Sign-In

Google Sign-In pour l'Assistant offre l'expérience utilisateur la plus simple et la plus simple possible aux utilisateurs et aux développeurs pour l'association et la création de compte. Votre action peut demander l'accès au profil Google de votre utilisateur lors d'une conversation, y compris le nom, l'adresse e-mail et la photo de profil de l'utilisateur.

Les informations du profil peuvent servir à créer une expérience utilisateur personnalisée. dans votre action. Si vous avez des applications sur d'autres plates-formes qui utilisent Google Sign-In, vous pouvez également trouver et associer le compte d'un utilisateur existant, créer un nouveau compte, et établir un canal de communication direct avec l’utilisateur.

Pour associer un compte avec Google Sign-In, vous demandez à l'utilisateur de donner son consentement pour accéder à son profil Google. Vous utilisez ensuite les informations de son profil, pour exemple son adresse e-mail, pour identifier l'utilisateur dans votre système.

Implémenter l'association de compte Google Sign-In

Suivez les étapes des sections suivantes pour ajouter une association de compte Google Sign-In à votre action.

Configurer le projet

Pour configurer votre projet afin d'utiliser l'association de compte Google Sign-In, procédez comme suit:

  1. Ouvrez la console Actions et sélectionnez un projet.
  2. Cliquez sur l'onglet Développer, puis sélectionnez Association de comptes.
  3. Activez le bouton bascule à côté de l'option Association de comptes.
  4. Dans la section Création de compte, sélectionnez Oui.
  5. Dans Type d'association, sélectionnez Google Sign-In.

  6. Ouvrez la page Informations sur le client et notez la valeur du numéro client attribué par Google à vos actions.

  7. Cliquez sur Enregistrer.

Concevoir l'interface utilisateur vocale pour le flux d'authentification

Vérifier si l'utilisateur est validé et démarrer le processus d'association de compte

  1. Ouvrez votre projet Actions Builder dans la console Actions.
  2. Créez une scène pour commencer à associer votre compte dans votre action: <ph type="x-smartling-placeholder">
      </ph>
    1. Cliquez sur Scenes (Scènes).
    2. Cliquez sur l'icône add (+) (Ajouter) (+) pour ajouter une scène.
  3. Dans la scène que vous venez de créer, cliquez sur le bouton Ajouter . pour Conditions.
  4. Ajoutez une condition qui vérifie si l'utilisateur associé à la conversation est un utilisateur validé. Si la vérification échoue, votre action ne peut pas associer le compte pendant la conversation, et devrait revenir à l'octroi d'un accès qui ne nécessite pas d'association de compte.
    1. Dans le champ Enter new expression, sous Condition, saisissez la logique suivante: user.verificationStatus != "VERIFIED"
    2. Sous Transition, sélectionnez une scène qui ne nécessite pas d'association de compte ou une scène qui est le point d'entrée de la fonctionnalité réservée aux invités.

  1. Cliquez sur l'icône d'ajout pour Conditions.
  2. Ajoutez une condition pour déclencher un flux d'association de comptes si l'utilisateur n'a pas une identité associée.
    1. Dans le champ Enter new expression, sous Condition, saisissez la logique suivante : user.verificationStatus == "VERIFIED"
    2. Sous Transition, sélectionnez la scène système Association de comptes.
    3. Cliquez sur Enregistrer.

Après l'enregistrement, une nouvelle scène système d'association de comptes appelée <SceneName>_AccountLinking est ajouté à votre projet.

Personnaliser l'association de comptes

  1. Sous Scenes (Scènes), sélectionnez la scène système d'association de comptes.
  2. Cliquez sur Envoyer la requête et ajoutez une courte phrase à décrire à l'utilisateur. pourquoi l'action a besoin d'accéder à son identité (par exemple, "Pour enregistrer vos préférences").
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur Si l'utilisateur réussit à associer le compte.
  2. Configurez la manière dont le flux doit se dérouler si l'utilisateur accepte d'associer son compte. Par exemple, vous pouvez appeler le webhook pour traiter toute logique métier personnalisée requise. et revenir à la scène d'origine.
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur Si l'utilisateur désactive ou ignore l'association de compte.
  2. Configurez la manière dont le flux doit se dérouler si l'utilisateur n'accepte pas d'associer son Google Cloud. Par exemple, envoyer un accusé de réception et rediriger l'utilisateur vers les scènes qui ne nécessitent pas d'association de comptes.
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur En cas d'erreur système ou réseau.
  2. Configurez la manière dont le flux doit se dérouler si le flux d'association de compte ne peut pas être terminée en raison d'erreurs système ou réseau. Par exemple, envoyer un accusé de réception et rediriger l'utilisateur vers les scènes qui ne nécessitent pas d'association de comptes.
  3. Cliquez sur Enregistrer.

Accéder aux informations de profil dans votre backend

Une fois que l'utilisateur a autorisé votre action à accéder à son profil Google, vous recevez un jeton d'ID Google contenant les informations du profil Google de l'utilisateur dans chaque demande à votre action.

Pour accéder aux informations de profil de l'utilisateur, vous devez d'abord valider et décoder le jeton en procédant comme suit:

  1. Utilisez une bibliothèque de décodage JWT pour votre langage afin de décoder et utiliser les clés publiques de Google (disponibles dans JWK ou PEM) pour vérifier la signature du jeton.
  2. Vérifiez que l'émetteur du jeton (champ iss dans le jeton décodé) est https://accounts.google.com et que l'audience (champ aud dans le jeton décodé) est la valeur de ID client attribué par Google à vos actions, attribué à votre projet dans la console Actions.

Voici un exemple de jeton décodé:

{
  "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"
}

Si vous utilisez la bibliothèque de traitement Actions on Google pour Node.js, procédez comme suit : il se charge de valider et de décoder le jeton pour vous, et vous donne accès le contenu du profil, comme indiqué dans les extraits de code suivants.

...
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;
      }
    }
  }
});

Gérer les requêtes d'accès aux données

Pour traiter la demande d'accès aux données, vérifiez simplement que l'utilisateur déclaré par l'ID Google ce jeton est déjà présent dans votre base de données. L'extrait de code suivant montre Voici un exemple de la procédure à suivre pour vérifier si les commandes d'un utilisateur existent déjà dans une base de données Firestore:

...
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!');
});