メインコンテンツへスキップ
Webhookを設定すると、購読しているテーブルのレコードが挿入、更新、削除されるたびに、Alforse が指定した URL へ HTTP POST を送信します。開発者は Webhook を使うことで、API をポーリングせずに Alforse の変更に対応できます。

Webhook の仕組み

  • 各 Webhook は、1 つのテーブルと 1 つ以上のトリガー操作を監視します。
  • 条件に一致する変更が発生すると、Alforse は配信をキューに入れ、非同期で送信します。通常は数瞬で届きます。
  • 各配信には、その Webhook 固有のシークレットで署名が付くため、エンドポイント側でリクエストが Alforse から送られたことを確認できます。
  • 本文は、レコードが変更されたことの通知です。対応する前に、APIキーを使って現在のレコードを取得してください。

購読できるテーブル

お使いの環境で受け付けるテーブルについては、Webhook フォームのテーブルドロップダウンを正としてください。トリガーの選択肢もテーブルによって異なります。テーブルによって公開される操作が限られているためです。receipt は挿入と削除を、employee は更新のみを公開します。

Webhook を設定する

設定 → Webhooksで Webhook を作成・管理します。次のフィールドに入力します。 Alforse は、ループバック、プライベートネットワーク、リンクローカル、クラウドのメタデータアドレスへの配信を拒否します。これにより、Webhook が内部システムへのアクセスに悪用されるのを防ぎます。 Webhook の一覧には、各 Webhook の成功数とエラー数が表示されます。これは配信の試行回数から集計されます。

配信の内容

本文

本文は 4 つのフィールドを持つ JSON です。

ヘッダー

イベント ID を冪等キーとして使用してください。1 つの変更は、すべての再試行を通じて同じイベント ID を保持し、新しい変更には、すでに通知を受けたレコードへの 2 回目の更新を含め、毎回新しい ID が付きます。

配信と再試行

配信は少なくとも 1 回行われます。エンドポイントが次のいずれかの場合、Alforse はその試行を失敗とみなし、指数バックオフで最大 8 回まで再試行します。
  • 10 秒以内に成功ステータスを返さない。
  • 5xx または 429 を返す。
それ以外の結果は再試行されません。
  • その他の 4xx レスポンスは、その変更の配信を終了します。
  • 3xx レスポンスは、Alforse がリダイレクトに従わないため、失敗として扱われます。最終的な URL を設定してください。
  • 拒否されたアドレスへの配信は再試行されません。
最後の試行が失敗すると、Alforse はその変更を失敗としてマークし、破棄します。

エンドポイントを設計する

  • 重複を想定してください。 最初の試行をすでに処理した後で、再試行が届くことがあります。重複排除は、type と record.id の組み合わせではなく x-omeriva-webhook-event で行ってください。同じレコードに対する別々の変更が、これらの値を共有するためです。
  • 障害後は照合してください。 破棄された変更は再送されません。すべてのイベントを処理する必要がある場合は、エンドポイントの停止後に API を照会して追いつかせてください。

配信を検証する

Webhook を作成すると、その Webhook 固有の署名シークレットも生成され、Alforse が暗号化して保管します。x-omeriva-webhook-signature の署名は、`${timestamp}.${body}` の HMAC-SHA256 を 16 進数で表したもので、シークレット文字列をキーとします。timestamp は x-omeriva-webhook-timestamp の値、body は生のリクエスト本文です。 配信を検証する手順は次のとおりです。
  1. パースする前に、生の本文を取得します。JSON をパースして再シリアライズするとバイト列が変わり、署名が一致しなくなります。
  2. HMAC を計算し、v1= の後ろの値と、定数時間の比較で照合します。
  3. 自分の時計から 5 分以上ずれているタイムスタンプは拒否します。これにより、傍受されたリクエストが再生されるのを防げます。再試行は毎回新しいタイムスタンプで再署名されるため、正当な再試行は通ります。

トラブルシューティング

関連項目