Google Sign-In pour l'Assistant offre l'expérience utilisateur la plus simple et la plus simple aux utilisateurs et aux développeurs concernant l'association et la création de comptes. Votre action peut demander l'accès au profil Google de l'utilisateur lors d'une conversation, y compris son nom, son adresse e-mail et sa photo de profil.
Les informations de profil peuvent servir à créer une expérience utilisateur personnalisée dans votre action. Si vous disposez d'applications sur d'autres plates-formes et qu'elles utilisent Google Sign-In, vous pouvez également rechercher et associer le compte d'un utilisateur existant, créer un compte et établir un canal de communication direct avec l'utilisateur.
Pour effectuer l'association de compte avec Google Sign-In, vous devez demander à l'utilisateur d'autoriser l'accès à son profil Google. Vous pouvez ensuite utiliser les informations de son profil (par exemple, son adresse e-mail) pour identifier l'utilisateur dans votre système.
Implémenter l'association de comptes Google Sign-In
Suivez les étapes décrites dans les sections suivantes pour ajouter un compte Google Sign-In à votre action.
Configurer le projet
Pour configurer votre projet afin d'utiliser l'association de comptes Google Sign-In, procédez comme suit:
- Ouvrez la console Actions et sélectionnez un projet.
- Cliquez sur l'onglet Développer et sélectionnez Associer un compte.
- Activez le bouton à côté de Association de comptes.
- Dans la section Création de compte, sélectionnez Oui.
Dans Type d'association, sélectionnez Google Sign-In.
Ouvrez la section Informations sur le client, puis notez la valeur de l'ID client émis par Google pour vos actions.
Cliquez sur Enregistrer.
Concevoir l'interface utilisateur vocale pour le flux d'authentification
Vérifier si l'utilisateur est validé et lancer le processus d'association de comptes
- Ouvrez votre projet Actions Builder dans la console Actions.
- Créez une scène pour lancer l'association de compte dans votre action :
- Cliquez sur Scènes.
- Cliquez sur l'icône add (+) pour ajouter une scène.
- Dans la scène que vous venez de créer, cliquez sur l'icône d'ajout 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 effectuer l'association de compte pendant la conversation et doit fournir un accès à une fonctionnalité 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'associer un compte ou une scène qui sert de point d'entrée à 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 d'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ée à votre projet.
Personnaliser la scène d'association de comptes
- Sous Scènes, sélectionnez la scène du système d'association de comptes.
- Cliquez sur Envoyer une invite et ajoutez une courte phrase pour expliquer à l'utilisateur pourquoi l'action doit accéder à son identité (par exemple, "Pour enregistrer vos préférences").
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur Si l'utilisateur a terminé l'association de comptes.
- Configurez la procédure à suivre si l'utilisateur accepte d'associer son compte. Par exemple, appelez le webhook pour traiter toute logique métier personnalisée requise et revenez à la scène d'origine.
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur Si l'utilisateur annule ou désactive l'association de comptes.
- Configurez la procédure à suivre si l'utilisateur n'accepte pas l'association de son compte. Par exemple, envoyez un message d'accusé de réception et redirigez les utilisateurs vers des scènes qui nécessitent une association de compte.
- Cliquez sur Enregistrer.
- Sous Conditions, cliquez sur En cas d'erreur système ou réseau.
- Configurez la procédure si le flux d'association de comptes ne peut pas être terminé en raison d'erreurs système ou réseau. Par exemple, envoyez un message d'accusé de réception et redirigez les utilisateurs vers des scènes qui nécessitent une association de compte.
- 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 de profil Google de l'utilisateur dans chaque requête envoyée à votre action.
Pour accéder aux informations du 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 le jeton, et vérifiez la signature du jeton à l'aide des clés publiques de Google (disponibles au format JWK ou PEM).
- 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é) correspond à la valeur de l'ID client émis par Google pour vos actions, qui est 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, elle valide et décode le jeton pour vous, et vous donne accès au 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 demandes d'accès aux données
Pour gérer la demande d'accès aux données, vérifiez simplement que l'utilisateur revendiqué par le jeton d'ID Google est déjà présent dans votre base de données. L'extrait de code suivant montre comment vérifier si des 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!'); });