Configurer Cloud Pub/Sub

Les agents RBM reçoivent des messages et des événements via une relation de publication/abonnement avec Cloud Pub/Sub. Lorsqu'un utilisateur envoie un message à votre agent ou génère un événement, son application de messagerie envoie les informations à l'abonnement Pub/Sub de l'agent, qui permet à votre agent d'accéder au message ou à l'événement. Consultez Recevoir des messages.

L'utilisateur envoie un message à l'agent.

Le type d'abonnement Pub/Sub de votre agent détermine la manière dont celui-ci reçoit les messages. Vous devez donc configurer votre abonnement Pub/Sub pour qu'il puisse recevoir des messages. Les agents RBM sont compatibles avec les abonnements pull et push.

Abonnement pull

Avec un abonnement pull, votre agent contacte Cloud Pub/Sub et récupère les messages, les événements et d'autres requêtes.

Prérequis

Avant de commencer, vous avez besoin d'un agent RBM.

Préparation

  1. Ouvrez la console pour les développeurs Business Communications, connectez-vous avec votre compte Google RBM, puis cliquez sur votre agent.
  2. Dans le volet de navigation de gauche, cliquez sur Integrations (Intégrations).
  3. Cliquez sur Modifier l'abonnement.
  4. Sélectionnez Extraire, puis cliquez sur Enregistrer.
  5. Configurez votre agent pour utiliser l'abonnement pull :
    • Si vous utilisez un exemple d'agent avec un abonnement pull, suivez les instructions du fichier README de l'exemple.
    • Si vous n'utilisez pas d'exemple d'agent, consultez la section Recevoir des messages à l'aide du mode d'envoi Pull pour obtenir du code permettant à votre agent d'utiliser l'abonnement pull. Selon votre langage de programmation, vous aurez peut-être besoin de l'ID de projet de votre agent.

Trouver votre ID de projet

Certains mécanismes d'abonnement pull nécessitent que vous spécifiiez l'ID du projet Google Cloud (GCP) de votre agent. L'ID de projet de votre agent est intégré au nom de l'abonnement pull après project/.

  1. Ouvrez la console pour les développeurs Business Communications, connectez-vous avec votre compte Google RBM, puis cliquez sur votre agent.
  2. Dans le volet de navigation de gauche, cliquez sur Integrations (Intégrations).
  3. Recherchez le nom d'abonnement de votre agent.
  4. Localisez le segment de texte entre project/ et /. Il s'agit de l'ID de projet de votre agent. Par exemple, si le nom de l'abonnement est projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription, l'ID de projet de votre agent est rbm-growing-tree-bank-nbdjkl6t.

C#

private async void InitPullMessages(string projectId, string jsonPath)
{
  GoogleCredential googleCredential = null;
  using (var jsonStream = new FileStream(jsonPath, FileMode.Open,
    FileAccess.Read, FileShare.Read))
  {
    googleCredential = GoogleCredential.FromStream(jsonStream)
      .CreateScoped(SubscriberServiceApiClient.DefaultScopes);
  }

  SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
  SubscriberClient subscriber = new SubscriberClientBuilder
  {
    SubscriptionName = subscriptionName,
    GoogleCredential = googleCredential

  }.Build();

  // setup listener for pubsub messages
  await subscriber.StartAsync(
    async (PubsubMessage message, CancellationToken cancel) =>
    {
      string text = System.Text.Encoding.UTF8.GetString(message.Data.ToArray());

      JObject jsonObject = JObject.Parse(jsonAsString);

      string userResponse = GetResponseText(jsonObject);
      string eventType = (string)jsonObject["eventType"];
    
      // check if the message is a user response message
      if ((userResponse.Length > 0) && (eventType == null))
      {
        string messageId = (string)jsonObject["messageId"];
        string msisdn = (string)jsonObject["senderPhoneNumber"];
        // let the user know their message has been read
        kitchenSinkBot.SendReadMessage(messageId, msisdn);
        HandleUserResponse(userResponse, msisdn);
      }
      await Console.Out.WriteLineAsync(
        $"Message {message.MessageId}: {jsonAsString}");
      return SubscriberClient.Reply.Ack;
    });
  }
}
Ce code est un extrait d'un exemple d'agent RBM.

Abonnement push

Avec un abonnement push, Cloud Pub/Sub envoie des messages, des événements et d'autres requêtes vers une URL de webhook que vous spécifiez.

Prérequis

Avant de commencer, vous avez besoin des éléments suivants:

  • Un agent RBM
  • Une URL de point de terminaison de webhook en direct compatible avec
    • HTTPS avec un certificat SSL valide
    • POST demandes
    • Possibilité d'échouer un paramètre en réponse à une demande de validation

Préparation

  1. Ouvrez la console pour les développeurs Business Communications, connectez-vous avec votre compte Google RBM, puis cliquez sur votre agent.
  2. Dans le volet de navigation de gauche, cliquez sur Integrations (Intégrations).
  3. Cliquez sur Modifier l'abonnement.
  4. Sélectionnez Push.
  5. Dans le champ URL du point de terminaison du webhook, saisissez l'URL de votre webhook commençant par "https://".
  6. Configurez votre webhook pour qu'il accepte une requête POST avec le paramètre clientToken spécifié et envoie une réponse 200 OK avec la valeur du paramètre secret.

    Par exemple, si votre webhook reçoit une requête POST avec le contenu du corps suivant :

    {
      "clientToken":"SJENCPGJESMGUFPY",
      "secret":"1234567890"
    }
    

    votre webhook doit confirmer la valeur clientToken et, si clientToken est correct, renvoyer une réponse 200 OK avec un corps de secret: 1234567890.

  7. Dans la console, cliquez sur Valider.

    Lorsque la plate-forme RBM valide votre webhook, la boîte de dialogue Configurer votre webhook se ferme.

  8. Cliquez sur Enregistrer.

  9. Configurez votre agent pour recevoir les messages de votre webhook:

    • Si vous utilisez un exemple d'agent avec un abonnement push, suivez les instructions du fichier README de l'exemple.
    • Si vous n'utilisez pas d'exemple d'agent, configurez votre infrastructure pour qu'elle transmette les messages de votre webhook à votre agent.

Node.js

let requestBody = req.body;

if ((requestBody.hasOwnProperty('clientToken')) && (requestBody.hasOwnProperty('secret'))) {
  console.log('RBM webhook verification request');

  // Confirm that the clientToken is the one we are seeing in the RBM console
  if (requestBody.clientToken == CLIENT_TOKEN) {
    console.log('Tokens match, returning secret');
    res.status(200).send('secret: ' + requestBody.secret);
  }
  else {
    // Client tokens did not match - sending permission denied
    console.log('Tokens do not match');
    res.sendStatus(403);
  }
}

Vérifier les messages entrants

Étant donné que les webhooks peuvent recevoir des messages de n'importe quel expéditeur, vous devez vérifier que Google a envoyé des messages entrants avant de traiter le contenu des messages.

Pour vérifier que Google a envoyé un message que vous avez reçu, procédez comme suit:

  1. Extrayez l'en-tête X-Goog-Signature du message. Il s'agit d'une copie hachée et encodée en base64 de la charge utile du corps du message.
  2. Décodez en base64 la charge utile RBM dans l'élément message.body de la requête.
  3. À l'aide du jeton client du webhook (que vous avez spécifié lors de la configuration de votre abonnement push) en tant que clé, créez un HMAC SHA512 des octets de la charge utile de message décodée en base64 et encodez le résultat en base64.
  4. Comparez le hachage X-Goog-Signature à celui que vous avez créé.
    • Si les hachages correspondent, vous confirmez que Google a envoyé le message.
    • Si les hachages ne correspondent pas, vérifiez votre processus de hachage sur un message connu comme correct.

      Si le processus de hachage fonctionne correctement et que vous recevez un message qui, selon vous, vous a été envoyé de manière frauduleuse, contactez-nous.

Node.js

if ((requestBody.hasOwnProperty('message')) && (requestBody.message.hasOwnProperty('data'))) {
  // Validate the received hash to ensure the message came from Google RBM
  let userEventString = Buffer.from(requestBody.message.data, 'base64');
  let hmac = crypto.createHmac('sha512', CLIENT_TOKEN);
  let data = hmac.update(userEventString);
  let genHash = data.digest('base64');
  let headerHash = req.header('X-Goog-Signature');

  if (headerHash === genHash) {
    let userEvent = JSON.parse(userEventString);

    console.log('userEventString: ' + userEventString);
    handleMessage(userEvent);
  }
  else {
    console.log('hash mismatch - ignoring message');
  }
}

res.sendStatus(200);

Étapes suivantes

Une fois que vous avez configuré votre abonnement et configuré votre agent pour communiquer avec Cloud Pub/Sub, votre agent peut recevoir des messages de vos appareils de test. Envoyez un message pour valider votre configuration.