Cloud Pub/Sub をセットアップする

RBM エージェントは、Cloud Pub/Sub とのパブリッシュ/サブスクライブ関係を介してメッセージとイベントを受信します。ユーザーがエージェントにメッセージを送信したり、イベントを生成すると、メッセージ アプリは、その情報をエージェントの Pub/Sub サブスクリプションに送信します。これにより、エージェントはメッセージやイベントにアクセスできます。メッセージを受信するをご覧ください。

ユーザーがエージェントにメッセージを送信します。

エージェントの Pub/Sub サブスクリプション タイプによってエージェントがメッセージを受信する方法が決まるため、エージェントがメッセージを受信する前に Pub/Sub サブスクリプションを構成する必要があります。RBM エージェントは、pullpush の両方のサブスクリプションをサポートします。

pull サブスクリプション

pull サブスクリプションでは、エージェントは Cloud Pub/Sub に接続し、メッセージ、イベント、その他のリクエストを取得します。

前提条件

始める前に、RBM エージェントが必要です。

設定

  1. Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
  2. 画面左のナビゲーションで [Integrations] をクリックします。
  3. [定期購入を編集] をクリックします。
  4. [pull] を選択し、[保存] をクリックします。
  5. pull サブスクリプションを使用するようにエージェントを構成します。
    • pull サブスクリプションでサンプル エージェントを使用する場合は、サンプルの README ファイルの手順に沿って操作してください。
    • サンプル エージェントを使用しない場合は、pull を使用してメッセージを受信するで、エージェントが pull サブスクリプションを使用できるようにするためのコードを確認してください。プログラミング言語によっては、エージェントのプロジェクト ID が必要になる場合があります。

プロジェクト ID を探す

一部の pull サブスクリプション メカニズムでは、エージェントの Google Cloud プロジェクト(GCP)プロジェクト ID を指定する必要があります。エージェントのプロジェクト ID は、project/ の後に続く pull サブスクリプション名に埋め込まれます。

  1. Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
  2. 画面左のナビゲーションで [Integrations] をクリックします。
  3. エージェントのサブスクリプション名を確認します。
  4. project/ とそれに続く / の間のテキスト セグメントを見つけます。これはエージェントのプロジェクト ID です。たとえば、サブスクリプション名が projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription の場合、エージェントのプロジェクト ID は 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;
    });
  }
}
このコードは、RBM サンプル エージェントからの抜粋です。

push サブスクリプション

push サブスクリプションを使用すると、Cloud Pub/Sub はメッセージ、イベント、その他のリクエストを、指定された Webhook URL に push します。

前提条件

始める前に、以下が必要です。

  • RBM エージェント
  • 以下をサポートするライブ Webhook エンドポイント URL
    • HTTPS と有効な SSL 証明書
    • POST 件のリクエスト
    • 検証リクエストに応じてパラメータをエコーする機能

設定

  1. Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
  2. 画面左のナビゲーションで [Integrations] をクリックします。
  3. [定期購入を編集] をクリックします。
  4. [プッシュ] を選択します。
  5. [Webhook エンドポイント URL] に、「https://」で始まる Webhook の URL を入力します。
  6. 指定された clientToken パラメータを含む POST リクエストを受け入れ、secret パラメータの値を含む 200 OK レスポンスを送信するように Webhook を構成します。

    たとえば、Webhook が次の本文を含む POST リクエストを受信した場合、

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

    Webhook は clientToken 値を確認し、clientToken が正しい場合は本文が secret: 1234567890200 OK レスポンスを返す必要があります。

  7. コンソールで [確認] をクリックします。

    RBM プラットフォームが Webhook を検証すると、[Webhook の構成] ダイアログが閉じます。

  8. [保存] をクリックします。

  9. Webhook からメッセージを受信するようにエージェントを構成します。

    • push サブスクリプションでサンプル エージェントを使用する場合は、サンプルの README ファイルの手順に沿って操作してください。
    • サンプル エージェントを使用しない場合は、Webhook からエージェントにメッセージを渡すようにインフラストラクチャを構成します。

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

受信メールを確認する

Webhook はどの送信者からでもメッセージを受信できるため、メッセージの内容を処理する前に、Google が受信メッセージを送信したことを確認する必要があります。

Google から送信したメッセージを確認する手順は次のとおりです。

  1. メールの X-Goog-Signature ヘッダーを抽出します。これは、メッセージ本文のペイロードのハッシュされ、base64 でエンコードされたコピーです。
  2. リクエストの message.body 要素内の RBM ペイロードを Base64 でデコードします。
  3. Webhook のクライアント トークン(push サブスクリプションの設定時に指定した)をキーとして使用し、base-64 でデコードされたメッセージ ペイロードのバイトの SHA512 HMAC を作成し、結果を base64 でエンコードします。
  4. X-Goog-Signature ハッシュと作成したハッシュを比較します。
    • ハッシュが一致する場合は、Google がメッセージを送信したと確認されています。
    • ハッシュが一致しない場合は、既知の正常なメッセージのハッシュ化プロセスを確認します。

      ハッシュ化プロセスが正常に機能し、不正に送信されたと思われるメッセージを受け取った場合は、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 と通信するようにエージェントを設定すると、エージェントはテストデバイスからメッセージを受信できます。メッセージを送信して設定を検証します。