Настройка Cloud Pub/Sub

Агенты RBM получают сообщения и события через отношения публикации/подписки с Cloud Pub/Sub . Когда пользователь отправляет сообщение вашему агенту или создает событие , его приложение для обмена сообщениями отправляет информацию в подписку Pub/Sub вашего агента, где ваш агент может получить доступ к сообщению или событию. См. Получение сообщений .

Пользователь отправляет сообщение агенту

Тип подписки Pub/Sub вашего агента определяет, как ваш агент получает сообщения, поэтому вам необходимо настроить подписку Pub/Sub, прежде чем ваш агент сможет получать сообщения . Агенты RBM поддерживают как подписку по запросу , так и по принуждению .

Подписка по запросу

При подписке по запросу ваш агент связывается с Cloud Pub/Sub и получает сообщения, события и другие запросы.

Предварительные условия

Прежде чем приступить к работе, вам понадобится агент RBM.

Настраивать

  1. Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
  2. На панели навигации слева нажмите «Интеграции» .
  3. Нажмите Изменить подписку .
  4. Выберите «Вытянуть» , затем нажмите « Сохранить» .
  5. Настройте свой агент для использования подписки по запросу:

Найдите идентификатор своего проекта

Некоторые механизмы подписки по запросу требуют, чтобы вы указали идентификатор проекта Google Cloud Project (GCP) вашего агента. Идентификатор проекта вашего агента встроен в имя подписки по запросу после project/ .

  1. Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
  2. На панели навигации слева нажмите «Интеграции» .
  3. Найдите название подписки вашего агента.
  4. Найдите текстовый сегмент между project/ и следующим / . Это идентификатор проекта вашего агента. Например, если имя подписки — projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription , идентификатор проекта вашего агента — rbm-growing-tree-bank-nbdjkl6t .

С#

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;
    });
  }
}
Этот код представляет собой отрывок из примера агента RBM .

Принудительная подписка

При принудительной подписке Cloud Pub/Sub отправляет сообщения, события и другие запросы на указанный вами URL-адрес веб-перехватчика.

Предварительные условия

Прежде чем приступить к работе, вам необходимо следующее:

  • Агент РБМ
  • URL-адрес конечной точки веб-перехватчика, который поддерживает
    • HTTPS с действительным сертификатом SSL
    • POST запросы
    • Возможность отображать параметр в ответ на запрос проверки.

Настраивать

  1. Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
  2. На панели навигации слева нажмите «Интеграции» .
  3. Нажмите Изменить подписку .
  4. Выберите «Нажать» .
  5. В поле URL-адрес конечной точки веб-перехватчика введите URL-адрес веб-перехватчика, начиная с https://.
  6. Настройте свой веб-перехватчик так, чтобы он принимал запрос POST с указанным параметром clientToken и отправлял ответ 200 OK со значением secret параметра.

    Например, если ваш вебхук получает запрос POST со следующим содержимым тела

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

    ваш вебхук должен подтвердить значение clientToken и, если clientToken верен, вернуть ответ 200 OK с телом secret: 1234567890 .

  7. В консоли нажмите «Проверить» .

    Когда платформа RBM проверит ваш веб-перехватчик, диалоговое окно «Настроить веб-перехватчик» закроется.

  8. Нажмите Сохранить .

  9. Настройте свой агент для получения сообщений от вашего веб-перехватчика:

    • Если вы используете образец агента с принудительной подпиской, следуйте инструкциям в файле README образца.
    • Если вы не используете образец агента, настройте свою инфраструктуру для передачи сообщений от вашего веб-перехватчика к вашему агенту.

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

Проверка входящих сообщений

Поскольку веб-перехватчики могут получать сообщения от любых отправителей, вам следует убедиться, что Google отправил входящие сообщения, прежде чем обрабатывать их содержимое.

Чтобы убедиться, что Google отправил полученное вами сообщение, выполните следующие действия:

  1. Извлеките заголовок X-Goog-Signature сообщения. Это хешированная копия полезных данных тела сообщения в кодировке Base64.
  2. Base-64-декодирует полезную нагрузку RBM в элементе message.body запроса.
  3. Используя клиентский токен веб-перехватчика (который вы указали при настройке принудительной подписки ) в качестве ключа, создайте SHA512 HMAC из байтов полезной нагрузки сообщения, декодированного в формате Base64, и закодируйте результат в формате Base64.
  4. Сравните хэш X-Goog-Signature с созданным вами хешем.
    • Если хеши совпадают, вы подтверждаете, что сообщение отправлено Google.
    • Если хэши не совпадают, проверьте процесс хеширования на заведомо исправном сообщении.

      Если ваш процесс хеширования работает правильно и вы получили сообщение, которое, по вашему мнению, было отправлено вам обманным путем, свяжитесь с нами .

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

Следующие шаги

После того как вы настроите подписку и настроите агента для связи с Cloud Pub/Sub, ваш агент сможет получать сообщения с ваших тестовых устройств . Отправьте сообщение, чтобы подтвердить настройку.