スタートガイド

このドキュメントでは、アプリの利用者がユーザー写真の変更を公開したときに通知を受け取るWebhookを設定する方法について説明します。このWebhookの設定の仕方を理解すれば、すべてのWebhooksを設定できるようになるでしょう。

Webhookを設定するには、次のことを行う必要があります。

  1. HTTPSリクエストを処理できるセキュアサーバーにエンドポイントを作成する
  2. アプリのアプリダッシュボードでWebhooks製品を構成する

これらのステップは、以下で詳しく説明します。

Create an Endpoint

Your endpoint must be able to process two types of HTTPS requests: Verification Requests and Event Notifications. Since both requests use HTTPs, your server must have a valid TLS or SSL certificate correctly configured and installed. Self-signed certificates are not supported.

The sections below explain what will be in each type of request and how to respond to them. Alternatively, you can use our sample app which is already configured to process these requests.

Verification Requests

Anytime you configure the Webhooks product in your App Dashboard, we'll send a GET request to your endpoint URL. Verification requests include the following query string parameters, appended to the end of your endpoint URL. They will look something like this:

Sample Verification Request

GET https://www.your-clever-domain-name.com/webhooks?
  hub.mode=subscribe&
  hub.challenge=1158201444&
  hub.verify_token=meatyhamhock
ParameterSample ValueDescription

hub.mode

subscribe

This value will always be set to subscribe.

hub.challenge

1158201444

An int you must pass back to us.

hub.verify_token

meatyhamhock

A string that that we grab from the Verify Token field in your app's App Dashboard. You will set this string when you complete the Webhooks configuration settings steps.

Note: PHP converts periods (.) to underscores (_) in parameter names.

Validating Verification Requests

Whenever your endpoint receives a verification request, it must:

  • Verify that the hub.verify_token value matches the string you set in the Verify Token field when you configure the Webhooks product in your App Dashboard (you haven't set up this token string yet).
  • Respond with the hub.challenge value.

If you are in your App Dashboard and configuring your Webhooks product (and thus, triggering a Verification Request), the dashboard will indicate if your endpoint validated the request correctly. If you are using the Graph API's /app/subscriptions endpoint to configure the Webhooks product, the API will indicate success or failure with a response.

Event Notifications

When you configure your Webhooks product, you will subscribe to specific fields on an object type (e.g., the photos field on the user object). Whenever there's a change to one of these fields, we will send your endpoint a POST request with a JSON payload describing the change.

For example, if you subscribed to the user object's photos field and one of your app's Users posted a Photo, we would send you a POST request that would look something like this:

POST / HTTPS/1.1
Host: your-clever-domain-name.com/webhooks
Content-Type: application/json
X-Hub-Signature-256: sha256={super-long-SHA256-signature}
Content-Length: 311

{
  "entry": [
    {
      "time": 1520383571,
      "changes": [
        {
          "field": "photos",
          "value":
            {
              "verb": "update",
              "object_id": "10211885744794461"
            }
        }
      ],
      "id": "10210299214172187",
      "uid": "10210299214172187"
    }
  ],
  "object": "user"
}

Payload Contents

Payloads will contain an object describing the change. When you configure the webhooks product, you can indicate if payloads should only contain the names of changed fields, or if payloads should include the new values as well.

We format all payloads with JSON, so you can parse the payload using common JSON parsing methods or packages.

We do not store any Webhook event notification data that we send you, so be sure to capture and store any payload content that you want to keep.

Most payloads will contain the following common properties, but the contents and structure of each payload varies depending on the object fields you are subscribed to. Refer to each object's reference document to see which fields will be included.

Property Description Type

object

The object's type (e.g., user, page, etc.)

string

entry

An array containing an object describing the changes. Multiple changes from different objects that are of the same type may be batched together.

array

id

The object's ID

string

changed_fields

An array of strings indicating the names of the fields that have been changed. Only included if you disable the Include Values setting when configuring the Webhooks product in your app's App Dashboard.

array

changes

An array containing an object describing the changed fields and their new values. Only included if you enable the Include Values setting when configuring the Webhooks product in your app's App Dashboard.

array

time

A UNIX timestamp indicating when the Event Notification was sent (not when the change that triggered the notification occurred).

int

Validating Payloads

We sign all Event Notification payloads with a SHA256 signature and include the signature in the request's X-Hub-Signature-256 header, preceded with sha256=. You don't have to validate the payload, but you should.

To validate the payload:

  1. Generate a SHA256 signature using the payload and your app's App Secret.
  2. Compare your signature to the signature in the X-Hub-Signature-256 header (everything after sha256=). If the signatures match, the payload is genuine.

Responding to Event Notifications

Your endpoint should respond to all Event Notifications with 200 OK HTTPS.

Frequency

Event Notifications are aggregated and sent in a batch with a maximum of 1000 updates. However batching cannot be guaranteed so be sure to adjust your servers to handle each Webhook individually.

If any update sent to your server fails, we will retry immediately, then try a few more times with decreasing frequency over the next 36 hours. Your server should handle deduplication in these cases. Unacknowledged responses will be dropped after 36 hours.

Note: The frequency with which Messenger event notifications are sent is different. Please refer to the Messenger Platform Webhooks documentation for more information.

Webhooks製品を構成する

エンドポイントまたはサンプルアプリの用意ができたら、アプリのアプリダッシュボードを使ってWebhooks製品を追加し、構成します。プログラムを使用して同じ操作をすることもできます。その場合には、Instagram以外のすべてのWebhooksに対して/{app-id}/subscriptionsエンドポイントを使います。

この例では、ダッシュボードを使って、アプリの利用者の写真に加えられた変更をフォローするWebhookを構成します。

  1. アプリダッシュボードの[製品] > [Webhooks]に移動し、ドロップダウンメニューから[ユーザー]を選択し、[このオブジェクトをフォローする]をクリックします。
    ユーザーオブジェクトを選択します。
  2. [コールバックURL]フィールドにエンドポイントのURLを、[トークンの確認]フィールドに文字列を入力します。この文字列はすべての確認リクエストに含まれます。いずれかのサンプルアプリを使用している場合は、アプリのTOKEN構成変数に使った文字列と同じ文字列にしてください。

    イベントのお知らせペイロードに、変更されたフィールドの名前だけでなく新規の値も含める場合は、[値を含める][Yes]に切り替えます。
    エンドポイントURLと確認トークン文字列を入力します。
  3. [確認して保存]をクリックすると、エンドポイントに確認リクエストが届くので、必ず確認してください。エンドポイントがリクエストの確認に成功すると、以下が表示されます。

    確認成功。
  4. 最後のステップで、フィールドを個別にサブスクリプション登録します。photosフィールドをフォローし、テストイベント通知を送信します。

    ユーザーオブジェクトのPhotosフィールドをフォローします。

    エンドポイントが正しく設定されると、ペイロードが検証され、検証成功時に実行するよう設定されたコードが実行されます。サンプルアプリを使っている場合は、アプリのURLをウェブブラウザーで読み込んでください。ペイロードのコンテンツが次のように表示されます。

    テスト通知ペイロードを表示しているサンプルアプリ。

Webhooks用のmTLS

相互TLS (mTLS)は相互認証のために使用します。

mTLSは、ネットワーク接続の当事者双方が正しい秘密鍵を持っていることを確認して、その当事者が本人であることを確認します。それぞれのTLS証明書内の情報により、追加の認証が行われます。

mTLSの設定方法

WhatsApp BusinessアカウントのサブスクリプションでmTLSを有効にすると、Metaはクライアント証明書とその署名付き中間証明書を提示します。どちらの証明書もサーバーへのWebhookリクエストのTLSハンドシェイクを作成するために使用されます。そうすると、サーバーがトラストチェーンと共通名(CN)によって、リクエストの送信者の身元を確認できます。

クライアント証明書は、中間CA証明書であるDigiCert SHA2 High Assurance Server CAによって署名された後、ルートCA証明書であるDigiCert High Assurance EV Root CAによって署名されます。中間証明書は次のようにgraph.facebook.comの証明書にも署名することに注意してください。

クライアント証明書の認証

Webhookリクエストを受信するためのHTTPSを設定した後、次の手順を実行してクライアント証明書とその共通名(client.webhooks.fbclientcerts.com)を確認します。

  1. ルート証明書をインストールする
  2. ルート証明書に照らしてクライアント証明書を確認する
  3. クライアント証明書の共通名(client.webhooks.fbclientcerts.com)を確認する

注: Webhooksを受信するサーバーはHTTPSを使用している必要があります。Metaでは、セキュリティ上の理由から常にHTTPSサーバーで証明書を確認しています。

上記の手順の詳細は、サーバーの設定によって異なります。ここでは、NginxとAWSアプリケーションロードバランサー(ALB)の2つの例を挙げて説明します。

Nginx

  1. DigiCertからルート証明書(DigiCert High Assurance EV Root CA)をサーバーにダウンロードする(例: /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem)

  2. NginxディレクティブでmTLSをオンにする(スクリーンショットの例)

    ssl_verify_client       on;
    ssl_client_certificate  /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem;
    ssl_verify_depth        3;
    
  3. Nginx埋め込み変数($ssl_client_s_dn)のCNが"client.webhooks.fbclientcerts.com"と同じであることを確認する(スクリーンショットの例)

    if ($ssl_client_s_dn ~ "CN=client.webhooks.fbclientcerts.com") {
        return 200 "$ssl_client_s_dn";
    }
    

AWSアプリケーションロードバランサー(ALB)

  1. DigiCertから中間証明書(DigiCert SHA2 High Assurance Server CA)をS3バケットにダウンロードします。ルート証明書はSHA1withRSAアルゴリズムを使って署名されているため、AWSでは受け入れられません。一方、中間証明書はSHA256withRSAを使って署名されているため受け入れられます。
  2. ALBのHTTPSリスナーを設定して、S3バケット内の証明書を含むトラストストアでmTLSを有効にします(スクリーンショットの例)。
  3. アプリケーションコードで、HTTPヘッダー“X-Amzn-Mtls-Clientcert-Subject”からCNを抽出し、“client.webhooks.fbclientcerts.com”と同じであることを確認します。

次のステップ

これでWebhooksの設定方法が理解できました。特定の製品のWebhooksの設定に関連するその他のステップについて補足するドキュメントを参照したい方は、以下をご覧ください。