receive-webhooks について
receive-webhooksは、ローカルテストや本番環境で、ngrok経由の受信Webhookをエッジで署名検証するスキルです。検証済みのリクエストをローカルポートまたは内部の受信サービスへ転送し、アプリケーションでの署名検証コード作成を不要にします。
主な機能
- 01ngrokエッジでプロバイダー署名を検証
- 02有効なリクエストをローカルポートへ転送
- 03リクエストを内部の受信サービスへ転送
- 04パスごとに複数プロバイダーをルーティング
- 05Vaultまたは環境変数でシークレットを保管
活用シーン
- 01受信Webhookをローカルでデバッグ
- 02本番の受信サービスを公開インターネットから隔離
- 03単一ゲートウェイで複数のWebhookプロバイダーに対応
- 04システム到達前に無効な署名を拒否
MCP 対応
ngrok MCPサーバーを使ってVaultやシークレットを作成し、Traffic Inspectorのリクエスト記録を照会できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ngrok/ skills --skill receive-webhooksインストール後、Claude Code で/receive-webhooksを入力して読み込まれたか確認します。
同梱ファイルreferences/providers.md
詳細
Webhook を受信する
受信した Webhook を受け取り、ngrok のエッジでプロバイダーの署名を検証して、ユーザーのサービスに配信します。検証コードを書く必要はなく、必要に応じてサービスを公開せずに利用できます。
始める前に
認証が必要です(ngrok-setup)。この作業では Traffic Policy を使用します。ngrok-engine から verify-webhook と forward-internal の仕組み、およびエンドポイントの選択方法を確認してください。
基本パターン(すべてのケース)
2 つのアクションを順に実行します。
verify-webhook- 署名を検証します(enforce: falseでない限り、検証に失敗すると 403 を返して拒否します)。- 配信 - テストではローカルポートに配信し、本番では
forward-internalでプライベートな受信先に転送します。
on_http_request:
- actions:
- type: verify-webhook
config:
provider: stripe
secret: "${secrets.get('webhooks', 'stripe-signing-secret')}"
- type: forward-internal
config: { url: https://billing.internal }
プロバイダーの一覧、プロバイダーごとのシークレット設定、リプレイ保護、エンドポイント検証チャレンジについては、references/providers.md を参照してください。
構成を選ぶ
- ローカルでのテスト/デバッグ -> ローカルポートに転送するエージェントエンドポイントを使用します。最も手早く設定できます。検証後、
forward-internalではなくポートに配信します。 - 本番/プライベート/規制対象/共有ゲートウェイ -> 検証とルーティングのポリシーを実行するクラウドエンドポイント(パブリックで常時稼働)を使用し、受信先をパブリックインターネットから隔離する内部エンドポイントに転送します。この構成でクラウド+内部エンドポイントを使う理由は、
ngrok-engineを参照してください。
適用する
ポリシーをアタッチし、ユーザーが利用する環境でエンドポイントを起動します。詳しくは ngrok-surfaces を参照してください。ポリシーの本文はどの環境でも同じで、異なるのはアタッチ方法だけです。
プロバイダーの Webhook 設定に貼り付ける公開 URL をユーザーに伝えてください。
シナリオ例(仕組みは同じで、重点が異なります)
- 「受信先をパブリックインターネットから隔離したい。」 クラウドエンドポイントがエッジで検証し、
forward-internalで内部にバインドされた受信先に転送します。インバウンドのファイアウォールポートは不要です。エージェントは 443 経由でアウトバウンド接続します。 - 「規制対象/コンプライアンスに準拠した配信が必要です。」 基本構成に加えて、シークレットは平文ではなく Vault に保管し、署名はシステムに到達する前に検証します。また、同じポリシーに IP 許可リストや JWT チェックを追加できます。検証に失敗した場合は拒否されます。
- 「すべてのプロバイダーに対応するゲートウェイを 1 つにしたい。」 1 つのポリシーに、パスでルーティングする複数のルール(
/stripe、/githubなど)を設定します。それぞれのルールでプロバイダーを検証してから適切な内部サービスに転送するため、サービスごとのコードではなく、検証、ルーティング、シークレットを 1 か所で管理できます。
動作を確認する
- プロバイダーのダッシュボードからテストイベントを送信するか、有効な署名ヘッダーを付けて
curlを実行します。 - 有効なリクエスト -> 上流に到達します。無効なリクエスト -> エッジで 403 を返します。
- エージェントの Web インスペクター(デフォルトは http://localhost:4040)またはダッシュボードの Traffic Inspector で、受信した各リクエストの正確なヘッダーと本文を確認します。
エージェント向けの注意事項
- 署名検証コードを書くようユーザーに伝えないでください。
verify-webhookで置き換えられることが、この仕組みの要点です。 - 署名シークレットをハードコードしないでください。Vault または環境変数を使用してください。
- 署名シークレットをチャットに貼り付けるようユーザーに求めないでください。また、その方法で提示されたシークレットも受け取らないでください。ユーザー自身に Vault または環境変数へ設定してもらい、ポリシーから参照してください。
ngrok-surfacesの「Account resources」で ngrok MCP サーバーを選択した場合は、gw_create_vaultで Vault を作成し、gw_create_secretでシークレットを作成します。シークレット用ツールでは、値を入力するためのダッシュボードフォームがユーザーに表示されるため、API キーは不要です。それ以外の場合は、ダッシュボードまたはngrok api secrets createを使用してください。トランスクリプトに記載されたwhsec_...は漏えいしたシークレットです。 - 本文を書き換える処理を
verify-webhookより前に実行してはいけません。署名チェックが失敗するためです。 - ngrok MCP サーバーに接続されている場合、
gw_query_traffic_inspectorでプロバイダーのリクエストが到着したか、エンドポイントが何を返したかを確認できます。受信先のデバッグを始める前に確認してください。