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 を設定してください。- 拒否されたアドレスへの配信は再試行されません。
エンドポイントを設計する
- 重複を想定してください。 最初の試行をすでに処理した後で、再試行が届くことがあります。重複排除は、
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 は生のリクエスト本文です。
配信を検証する手順は次のとおりです。
- パースする前に、生の本文を取得します。JSON をパースして再シリアライズするとバイト列が変わり、署名が一致しなくなります。
- HMAC を計算し、
v1=の後ろの値と、定数時間の比較で照合します。 - 自分の時計から 5 分以上ずれているタイムスタンプは拒否します。これにより、傍受されたリクエストが再生されるのを防げます。再試行は毎回新しいタイムスタンプで再署名されるため、正当な再試行は通ります。