HubSpotからのリクエストを検証する
連携においてHubSpotから受け取るリクエストが実際にHubSpotから送信されたことを確かめるために、いくつかのヘッダーがリクエストに入力されます。これらのヘッダーと一緒に受信リクエストのフィールドを使用して、リクエストの署名を確認することができます。
署名の確認方法は署名のバージョンによって異なります。
- HubSpot署名の最新バージョンを使用したリクエストを検証するには、
X-HubSpot-Signature-V3
ヘッダーを使用し、v3バージョンの署名を検証するための関連手順に従います。 - 後方互換性を維持するために、HubSpotからのリクエストには旧バージョンの署名も含まれています。旧バージョンの署名を検証するには、
X-HubSpot-Signature-Version
ヘッダーをチェックしてから、バージョンがv1
とv2
のどちらであるかに基づいて、以下の関連手順に従います。
以下の方法で、アプリのクライアントシークレットからのハッシュ値と受信リクエストのフィールドを抽出することができます。ハッシュ値を計算したら、その値を署名と比較します。両者が等しい場合は、リクエストは検証に合格したことになります。そうでない場合は、リクエストが転送中に改ざんされたか、あるいは他の誰かがエンドポイント宛ての偽装のリクエストを送信している可能性があります。
アプリがWebhooks API経由でCRMオブジェクトイベントに登録されている場合は、X-HubSpot-Signature-Version
ヘッダーがv1
に設定されたリクエストがHubSpotから送信されます。X-HubSpot-Signature
ヘッダーは、貴社のアプリのクライアントシークレットとリクエスト詳細の組み合わせに基づくSHA-256ハッシュになっています。
この署名のバージョンを確認するには、以下の手順に従います。
クライアントシークレット
+リクエスト本文
(存在する場合)のように連結した文字列を作成します。- 連結した文字列のSHA-256ハッシュを生成します。
- ハッシュ値と
X-HubSpot-Signature
ヘッダーの値を比較します。- 同一の場合、このリクエストが検証に合格したことになります。
- これらの値が一致しない場合、転送中にリクエストが改ざんされたか、誰かがHubSpotになりすまして貴社のエンドポイントにリクエストを送信していると考えられます。
リクエスト本文の例
v1のリクエスト署名の例
この場合は以下のハッシュ値が得られます。232db2615f3d666fe21a8ec971ac7b5402d33b9a925784df3ca654d05f4817de
アプリがワークフロー内のWebhookアクションからのデータを処理している場合、またはカスタムCRMカード用のデータを返している場合は、X-HubSpot-Signature-Version
ヘッダーがv2
に設定されたリクエストがHubSpotから送信されます。X-HubSpot-Signature
ヘッダーは、貴社のアプリのクライアントシークレットとリクエスト詳細の組み合わせに基づくSHA-256ハッシュになっています。
この署名を検証するには、以下の手順に従います。
クライアントシークレット
+HTTPメソッド
+URI
+リクエスト本文
(存在する場合)のように連結した文字列を作成します。- 連結した文字列のSHA-256ハッシュを生成します。
- ハッシュ値を署名と比較します。
- 同一の場合、このリクエストが検証に合格したことになります。
- これらの値が一致しない場合、転送中にリクエストが改ざんされたか、誰かがHubSpotになりすまして貴社のエンドポイントにリクエストを送信していると考えられます。
注:
- ソース文字列の作成に使用するURIは、(プロトコルを含めて)元のリクエストと完全に一致する必要があります。署名の検証に問題がある場合は、クエリーパラメーターが元のリクエストに記載した順序と同じになっていることを確かめてください。
- ソース文字列は、SHA-256ハッシュ値の計算前にUTF-8にエンコードしておく必要があります。
GETリクエストの例
クライアントシークレット
:yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyHTTPメソッド
:GETURI
:https://www.example.com/webhook_uri
リクエスト本文の例
クライアントシークレット
:yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyHTTPメソッド
:POSTURI
:https://www.example.com/webhook_uriリクエスト本文
:{"example_field":"example_value"}
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 |
; |
requestMethod
+requestUri
+requestBody
+タイムスタンプのように連結したutf-8エンコード文字列を作成します。タイムスタンプは、X-HubSpot-Request-Timestamp
ヘッダーで提供されます。- アプリシークレットをHMAC SHA-256関数のシークレットとして使用し、連結した文字列のHMAC SHA-256ハッシュを作成します。
- HMAC関数の結果をBase64エンコードします。
- ハッシュ値を署名と比較します。同一の場合、このリクエストの発信元がHubSpotであることが検証されたことになります。タイミング攻撃を防ぐために、一定時間の文字列比較を使用することをお勧めします。
貴重なご意見をありがとうございました。