Outgoing Webhook

[更新: 2021年12月21日]

Outgoing WebhookサービスアダプタはデバイスからIoTクラウドコアへの片方向通信を実現します。

1. サービスアダプタ作成

さくらのクラウドコントロールパネルより新規にサービスアダプタを作成します。

サービスアダプタの追加画面からOutgoing Webhookに必要な情報を入力します。

Outgoing Webhook サービスアダプタ入力項目
名前 サービスアダプタを管理する名前を入力します。
プロジェクト サービスアダプタを接続するプロジェクトを選択します。
作成されたサービスアダプタは、ここで選択したプロジェクトに所属するSIMとのみ通信できます。
サービスアダプタ outgoing webhookを選択します。
Payload URL 送信先のWebhook URLを入力します。※ http/https から始まるURLを入力してください。
シークレット 任意に文字列を設定します。Payload URLに届いたメッセージの検証を行い、メッセージの改ざんなどを防止します。
シークレットを設定した場合、リクエストにX-Sakura-Signatureヘッダが付与されています。
X-Sakura-Signature には、リクエストボディをメッセージ、Secret に入力した文字をキーとするHMAC-SHA1が設定されているため、これを検証してください。

各項目を入力し、「作成」ボタンをクリックするとサービスアダプタを作成できます。なお、入力した項目は後からでも変更ができます。

2. メッセージの受信

Outgoing Webhookサービスアダプタでデバイスからのメッセージを受信します。

例としてPayload URLに設定したサーバーにてOutgoing Webhookからのメッセージを受信します。 サーバ内の適当な階層にて以下を記載したindex.phpを用意します。

<?php
$fp = fopen('php://stdout', 'w');

$json = file_get_contents('php://input');
fprintf($fp, "receive message: ".$json."\n");

$headers = getallheaders();
$secret = $headers['X-Sakura-Signature'] ?? '';
if ($secret) fprintf($fp, "secret: ".$secret."\n");

$secret_verify = hash_hmac('sha1', $json, "<secret>");
fprintf($fp, "secret_verify: ".$secret_verify."\n");

if ($secret_verify === $secret)
   fprintf($fp, "OK \n");
else
   fprintf($fp, "InValid Secret \n");
  • Outgoing WebhookからPOSTされるメッセージデータを取得します。
  • シークレットを設定している場合、リクエストにHMAC-SHA1のX-Sakura-Signatureを取得し検証します。<secret>は適宜書き換えます。

簡易的な確認としてビルトインサーバを立ててデバイスからIoTクラウドコアへメッセージを送ります。

$ php -S 0.0.0.0:8000

本例の場合、メッセージを受信した場合コンソール上でOKのログが表示されます。

$ php -S 0.0.0.0:8888
receive message: {"id":"xxxxxxxx","module_id":"xxxxxx","timestamp_src":1609459200000,"timestamp_platform_from_src":1638772594137,"timestamp_platform_to_dst":1638772594249,"type":"object","payload":[{"type":"int32","tag":"00","value":65536},{"type":"float64","tag":"00","value":3.141592653589793}]}
secret: xxxxxx
secret_verify: xxxxxx
OK

また、サーバ側でのシークレットの照合に失敗した場合、コンソール上でInValid Secretログが表示されます。

$ php -S 0.0.0.0:8888
receive message: {"id":"xxxxxxxx","module_id":"xxxxxx","timestamp_src":1609459200000,"timestamp_platform_from_src":1638772594137,"timestamp_platform_to_dst":1638772594249,"type":"object","payload":[{"type":"int32","tag":"00","value":65536},{"type":"float64","tag":"00","value":3.141592653589793}]}
secret: xxxxxx
secret_verify: yyyyyy
InValid Secret