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:
- Ouvrez la console Actions et sélectionnez un projet.
- Cliquez sur l'onglet Développer, puis sélectionnez Association de comptes.
- Activez le bouton bascule à côté de l'option Association de comptes.
- Dans la section Création de compte, sélectionnez Oui.
Dans Type d'association, sélectionnez Google Sign-In.
Ouvrez la page Informations sur le client et notez la valeur du numéro client attribué par Google à vos actions.
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
- Ouvrez votre projet Actions Builder dans la console Actions.
- Créez une scène pour commencer à associer votre compte dans votre action:
<ph type="x-smartling-placeholder">
- </ph>
- Cliquez sur Scenes (Scènes).
- Cliquez sur l'icône add (+) (Ajouter) (+) pour ajouter une scène.
- Dans la scène que vous venez de créer, cliquez sur le bouton Ajouter add. pour Conditions.
- 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.
- Dans le champ
Enter new expression
, sous Condition, saisissez la logique suivante:user.verificationStatus != "VERIFIED"
- 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.
- Dans le champ
- Cliquez sur l'icône d'ajout add pour Conditions.
- Ajoutez une condition pour déclencher un flux d'association de comptes si l'utilisateur n'a pas
une identité associée.
- Dans le champ
Enter new expression
, sous Condition, saisissez la logique suivante :user.verificationStatus == "VERIFIED"
- Sous Transition, sélectionnez la scène système Association de comptes.
- Cliquez sur Enregistrer.
- Dans le champ
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
- Sous Scenes (Scènes), sélectionnez la scène système d'association de comptes.
- 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").
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur Si l'utilisateur réussit à associer le compte.
- 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.
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur Si l'utilisateur désactive ou ignore l'association de compte.
- 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.
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur En cas d'erreur système ou réseau.
- 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.
- 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:
- 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.
- Vérifiez que l'émetteur du jeton (champ
iss
dans le jeton décodé) esthttps://accounts.google.com
et que l'audience (champaud
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!'); });