Webhookリクエストの検証

Webhook外部URL呼び出しによって呼び出されるサーバー側で、リクエスト内容がObotAIのウェブフックサーバーから送信されたかどうかを検証できます。

シグネチャーキーの取得

ObotAI CMSの『ウェブフック』画面にはシグネチャーキーが表示されます。

シグネチャーキーの値を控えておきます。この値は外部に公開しないでください。

_images/webhook-signature-key.png

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)