WhatsApp Webhook エンドポイントの認証
イベントを配信する前に、Meta は hub.mode、hub.verify_token、hub.challenge を含む GET をエンドポイントに送ります。エンドポイントはトークンを比較し、チャレンジをレスポンスボディとしてそのまま返す必要があります。それ以外の場合、配信は始まりません。
レスポンスボディとして返す必要がある値です。
認証リクエストにおける hub.mode の値です。
Meta が認証する唯一の方式です。呼び出し前に HTTP は拒否されます。
Meta は具体的に何を送りますか?
3 つのクエリパラメータを付けた GET リクエストを URL に送ります。hub.mode は subscribe に設定されます。hub.verify_token は、送信先の設定時に指定したトークンです。hub.challenge は、この試行のために Meta が生成する値です。
エンドポイントでは、hub.verify_token と指定したトークンを比較してください。一致した場合は、200 と hub.challenge だけをレスポンスボディ全体として返します。JSON で包まず、値を引用符で囲まず、一部のフレームワークが標準で追加する末尾の改行も付けません。
トークンが一致しない場合は 403 を返します。これがプロトコルのすべてで、意図的に小さく設計されています。
間違った返答はなぜ何も知らせずに失敗しますか?
認証の失敗は、あなたのシステムのエラーではなく、Meta 側で配信が存在しない状態になるためです。
チャレンジが正しく返されないと、Meta はその送信先への配信を開始しません。サーバーは認証に 200 を返し、ログにはリクエストの到着が記録されますが、どのダッシュボードにも問題は表示されません。唯一の症状はメッセージが届かないことです。そのため、多くの人はこれをハンドシェイクの問題ではなく Coexistence の問題だと判断します。
だからこそ、呼び出し前の検証が重要です。EasyCoexistence は Graph リクエストを送る前に、URL が HTTPS であり、認証トークンが指定されていることを確認します。そのため、不正な送信先は接続済みのように見えるのではなく、すぐに失敗します。
ほかに認証を妨げるものはありますか?
コードとは無関係なものが 3 つあります。
エンドポイントの前に認証を置くことです。ゲートウェイ、基本認証レイヤー、IP 許可リストは Meta のリクエストを拒否します。Meta には提示できる認証情報がありません。認証なしで認証ルートに到達できる必要があります。
リダイレクトです。Meta は指定された URL を呼び出しますが、正規ホストへの 301 がハンドシェイクを完了する形で追跡されるとは限りません。最終 URL を指定してください。
そして、レスポンスをシリアライズするフレームワークです。ハンドラーから文字列を返しても、すべてを JSON で包む設定だと、チャレンジが引用符で囲まれたボディになります。その場合は一致しません。
よくある間違い
- JSON を返すこと。ボディは余計なものを付けず、チャレンジの値をそのまま返す必要があります。
- エンドポイントを認証の背後に置くこと。Meta には認証情報がないため、拒否されます。
- リダイレクトする URL を Meta に渡すこと。最終 URL を使用してください。
EasyCoexistence は Meta を呼び出す前に送信先が HTTPS で、認証トークンを持つことを確認し、失敗したハンドシェイクを接続タイムラインに記録します。
よくある質問
どのトークンを使用すればよいですか?
任意の文字列を指定できます。URL を知っている他の人ではなく、Meta からのリクエストだとエンドポイントが判断するために使います。
認証はどのくらいの頻度で行われますか?
設定時と、送信先を設定するたびに行われます。動作しているエンドポイントがイベントごとに再認証されることはありません。
自分でテストできますか?
はい。3 つのパラメータを付けて自分のエンドポイントを呼び出し、ボディがチャレンジの値と完全に一致することを確認してください。
認証中にサーバーが停止していた場合はどうなりますか?
ハンドシェイクが失敗し、送信先は有効になりません。もう一度保存すると再実行されます。
続きを読む
始める準備はできましたか?
WhatsApp Coexistence の設定は数分で完了し、数か月もかかりません。スマートフォン上のアプリも引き続き使えます。
無料トライアルを始める確認日