Webhookリクエストの検証¶
Webhook外部URL呼び出しによって呼び出されるサーバー側で、リクエスト内容がObotAIのウェブフックサーバーから送信されたかどうかを検証できます。
シグネチャーキーの取得¶
ObotAI CMSの『ウェブフック』画面にはシグネチャーキーが表示されます。
シグネチャーキーの値を控えておきます。この値は外部に公開しないでください。
X-Webhook-Signatreヘッダーの照合¶
ObotAIのWebhookサーバーからのリクエストには、 X-Webhook-Signature
キーが含まれます。
CMSの画面で取得したシグネチャーキーを使って、リクエストbodyからHMAC-SHA256のシグネチャー値を計算し、ヘッダーから得た値と照合します。
値が一致する場合は、ObotAIのWebhookからのリクエストとみなすことができます。
サンプルコード¶
このサンプルコードはFlaskフレームワークを使ってPythonで書かれた外部呼び出し先のサーバーの実装です。
リクエスト内容からシグネチャー値を計算し、リクエストを検証しています。
import hashlib
import hmac
from flask import Flask, request, jsonify
# シグネーチャーキー
signature_key = b"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
app = Flask(__name__)
@app.route('/', methods=["post"])
def endpoint():
# リクエストのX-Webhook-Signatureヘッダー
request_signature = request.headers['X-Webhook-Signature']
# リクエストbodyからシグネチャー値を算出
calculated_signature = hmac.new(
signature_key, request.data, digestmod=hashlib.sha256).hexdigest()
if request_signature != calculated_signature:
# 一致しない場合は不正なリクエストとみなす
return 'Invalid signature', 400
# webhookの処理
response = {
"fulfillmentMessages":[
{
"text": {"text": ["こんにちは"]},
"platform": "web_chat_v2"
}
]
}
return jsonify(response)