最終更新日: 2025年8月22日
連携においてHubSpotから受け取るリクエストが実際にHubSpotから送信されたことを確かめるために、いくつかのヘッダーがリクエストに入力されます。これらのヘッダーと一緒に受信リクエストのフィールドを使用して、リクエストの署名を確認することができます。
署名の確認方法は署名のバージョンによって異なります。
- HubSpot署名の最新バージョンを使用したリクエストを検証するには、
X-HubSpot-Signature-V3
ヘッダーを使用し、v3バージョンの署名を検証するための関連手順に従います。 - 後方互換性を維持するために、HubSpotからのリクエストには旧バージョンの署名も含まれています。旧バージョンの署名を検証するには、
X-HubSpot-Signature-Version
ヘッダーをチェックしてから、バージョンがv1
とv2
のどちらであるかに基づいて、以下の関連手順に従います。
V1リクエスト署名を使用したリクエストの検証
アプリがWebhooks API経由でCRMオブジェクトイベントに登録されている場合は、X-HubSpot-Signature-Version
ヘッダーがv1
に設定されたリクエストがHubSpotから送信されます。X-HubSpot-Signature
ヘッダーは、貴社のアプリのクライアントシークレットとリクエスト詳細の組み合わせに基づくSHA-256ハッシュになっています。
この署名のバージョンを確認するには、以下の手順に従います。
- 次のように連結した文字列を作成します:
Client secret
+request body
(存在する場合)。 - 連結した文字列のSHA-256ハッシュを生成します。
- ハッシュ値と
X-HubSpot-Signature
ヘッダーの値を比較します。- 同一の場合、このリクエストが検証に合格したことになります。
- これらの値が一致しない場合、転送中にリクエストが改ざんされたか、誰かがHubSpotになりすまして貴社のエンドポイントにリクエストを送信していると考えられます。
v1のリクエスト署名の例:
Pythonの例
Ruby の例
Node.jsの例
Javaの例
232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de
V2リクエスト署名を使用したリクエストの検証
アプリがワークフロー内のWebhookアクションからのデータを処理している場合、またはカスタムCRMカード用のデータを返している場合は、X-HubSpot-Signature-Version
ヘッダーがv2
に設定されたリクエストがHubSpotから送信されます。X-HubSpot-Signature
ヘッダーは、貴社のアプリのクライアントシークレットとリクエスト詳細の組み合わせに基づくSHA-256ハッシュになっています。
この署名を検証するには、次の手順に従います。
- 次のように連結した文字列を作成します:
Client secret
+http method
+URI
+request body
(存在する場合)。 - 連結した文字列のSHA-256ハッシュを生成します。
- ハッシュ値を署名と比較します。
- 同一の場合、このリクエストが検証に合格したことになります。
- これらの値が一致しない場合、転送中にリクエストが改ざんされたか、誰かがHubSpotになりすまして貴社のエンドポイントにリクエストを送信していると考えられます。
- ソース文字列の作成に使用するURIは、(プロトコルを含めて)元のリクエストと完全に一致する必要があります。署名の検証に問題がある場合は、クエリーパラメーターが元のリクエストに記載した順序と同じになっていることを確かめてください。
- ソース文字列は、SHA-256ハッシュ値の計算前にUTF-8にエンコードしておく必要があります。
GETリクエストの例
GET
リクエストでは、アプリのクライアントシークレットと、リクエストのメタデータの特定のフィールドが必要です。これらのフィールドとプレースホルダー値を以下に示します。
- クライアントシークレット:
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
- HTTPメソッド:
GET
- URI:
https://www.example.com/webhook_uri
- リクエスト本文:
""
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyGEThttps://www.example.com/webhook_uri
上記の連結文字列のSHA-256ハッシュを計算することで生成される、ヘッダーの署名と照合する署名は次のようになります。eee2dddcc73c94d699f5e395f4b9d454a069a6855fbfa152e91e88823087200e
POSTリクエストの例
POST
リクエストでは、アプリのクライアントシークレット、リクエストのメタデータの特定のフィールド、リクエスト本文の文字列表現(例:Node.jsサービスではJSON.stringify(request.body)
を使用)が必要です。これらのフィールドとプレースホルダー値を以下に示します。
- クライアントシークレット:
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
- HTTPメソッド:
POST
- URI:
https://www.example.com/webhook_uri
- リクエスト本文:
{"example_field":"example_value"}
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyPOSThttps://www.example.com/webhook_uri{"example_field":"example_value"}
上記の連結文字列のSHA-256ハッシュを計算することで生成される、ヘッダーの署名と照合する署名は次のようになります。9569219f8ba981ffa6f6f16aa0f48637d35d728c7e4d93d0d52efaa512af7900
署名の[SHAハッシュ値]を計算したら、その結果として得られる署名を、リクエストのx-hubspot-signatureヘッダーで提供される署名と比較できます。
以下のコードスニペットは、GET
リクエストを処理するExpressサーバーを実行している場合に、v2
リクエストの検証を組み込む方法について詳しく説明しています。以下のコードブロックは一例であり、Expressサービスの全機能を実行するために必要な特定の依存関係が省略されていることに注意してください。特定のサービスにリクエストの検証を実装するときには、最新の安定した安全なライブラリーを実行していることを確認してください。
v2のリクエスト署名の例
Node.jsの例
Javaの例
V3のリクエスト署名の検証
X-HubSpot-Signature-v3
ヘッダーは、貴社のアプリのクライアントシークレットとリクエスト詳細の組み合わせに基づくHMAC SHA-256ハッシュになっています。また、X-HubSpot-Request-Timestamp
ヘッダーも含まれます。
以下の手順に従って、X-HubSpot-Signature-v3ヘッダーを使用してリクエストを検証します。
- タイムスタンプが5分前よりも古い場合には、リクエストを拒否します。
- リクエストURIで、下表に示すURLエンコード文字のいずれかをデコードします。クエリー文字列の先頭を示す疑問符をデコードする必要はありません。
エンコード値 | デコード値 |
---|---|
%3A | : |
%2F | / |
%3F | ? |
%40 | @ |
%21 | ! |
%24 | $ |
%27 | ' |
%28 | ( |
%29 | ) |
%2A | * |
%2C | , |
%3B | ; |
- 次のように連結したUTF-8でエンコードされた文字列を作成します:
requestMethod
+requestUri
+requestBody
+タイムスタンプ。タイムスタンプは、X-HubSpot-Request-Timestamp
ヘッダーで提供されます。 - アプリシークレットをHMAC SHA-256関数のシークレットとして使用し、連結した文字列のHMAC SHA-256ハッシュを作成します。
- HMAC関数の結果をBase64エンコードします。
- ハッシュ値を署名と比較します。同一の場合、このリクエストの発信元がHubSpotであることが検証されたことになります。タイミング攻撃を防ぐために、一定時間の文字列比較を使用することをお勧めします。
POST
リクエストにv3リクエスト検証を組み込む方法を詳しく説明しています。以下のコードブロックは、フル機能のバックエンドサービスを実行するために必要な特定の依存関係を省略している点に留意してください。特定のサービスにリクエストの検証を実装するときには、最新の安定した安全なライブラリーを実行していることを確認してください。