Webhookのセキュリティ
プライベートAPIキーを使ったHMAC SHA-256署名で、OptacyのWebhookを認証します。
Optacyからのデータのみを受け付けるよう、すべてのWebhookリクエストを検証する必要があります。各リクエストの署名オブジェクトには、次の3つのフィールドが含まれます。
- ランダムトークン
- タイムスタンプ(1970年1月1日からのミリ秒数)
- 署名:タイムスタンプとランダムトークンを連結した文字列のHMAC SHA-256値。キーには、ダッシュボードのWebhooksタブにあるプライベートAPIキーを使用します
認証方法
timestampとtokenを、スペースを入れずに1つの文字列に連結します。- プライベートAPIキーを使って、その文字列のHMAC SHA-256を計算します。
- 16進ダイジェストを、リクエストの
signatureフィールドと比較します。 - 一致すればリクエストを受け入れ、一致しなければ拒否します。
プライベート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経由であればリプレイのリスクはすでに低いため、このチェックは任意であり、上記の例には含まれていません。