メインコンテンツへスキップ

Webhookのセキュリティ

プライベートAPIキーを使ったHMAC SHA-256署名で、OptacyのWebhookを認証します。

Optacyからのデータのみを受け付けるよう、すべてのWebhookリクエストを検証する必要があります。各リクエストの署名オブジェクトには、次の3つのフィールドが含まれます。

  • ランダムトークン
  • タイムスタンプ(1970年1月1日からのミリ秒数)
  • 署名:タイムスタンプとランダムトークンを連結した文字列のHMAC SHA-256値。キーには、ダッシュボードのWebhooksタブにあるプライベートAPIキーを使用します

認証方法

  1. timestampとtokenを、スペースを入れずに1つの文字列に連結します。
  2. プライベートAPIキーを使って、その文字列のHMAC SHA-256を計算します。
  3. 16進ダイジェストを、リクエストのsignatureフィールドと比較します。
  4. 一致すればリクエストを受け入れ、一致しなければ拒否します。

プライベートAPIキーは安全に保管し、安全な方法で参照してください(一般的には環境変数を使用します)。

Ruby on Railsの例

token = params["signature"]["random_token"]
timestamp = params["signature"]["timestamp"]
signature = params["signature"]["signature"]

signed_test_data = OpenSSL::HMAC.hexdigest(
  "SHA256",
  ENV["OPTACY_WEBHOOK_PRIVATE_API_TOKEN"],
  "#{timestamp}#{token}"
)

if signed_test_data == signature
  # リクエストを受け入れる
else
  raise "Optacy webhook did not authenticate"
end

リプレイ攻撃の防止

リプレイ攻撃を軽減するため、数分以上前のタイムスタンプを拒否することもできます。HTTPS経由であればリプレイのリスクはすでに低いため、このチェックは任意であり、上記の例には含まれていません。