スレッドコンテキスト

MessengerエクステンションSDK

このメソッドは、MessengerエクステンションSDKの一部です。サイトにSDKを実装する方法については、こちらのMessengerエクステンションSDKの追加に関するページをご覧ください。

利用の条件

このAPIは、Androidの場合はv113以降のMessenger、iOSの場合はv114以降のMessengerでのみご利用いただけます。

所定のクライアントで利用可能かを確認するには、getSupportedFeatures()を呼び出し、応答の中にcontextプロパティがあるか確認します。

getContext()メソッドは、利用者とウェブビューを開いたスレッドに関する追加情報を取得します。インタラクティブなグループエクスペリエンスやゲームを開発したり、コンテンツを制限して特定のスレッドのみにシェアしたりする際に便利です。

getUserID()は現在廃止されているため、代わりにgetContext()を使用する必要があります。

スレッドコンテキストを取得する

この関数を呼び出すと、利用者のPSID、スレッドID、スレッドのタイプを取得できます。すべてのメソッドパラメーターのリストについては、「getContext() リファレンス」をご覧ください。

MessengerExtensions.getContext('YOUR_APP_ID', 
  function success(thread_context){
    // success
  },
  function error(err){
    // error
  }
);

応答形式

success callbackに渡される応答は、以下の形式のJavaScriptオブジェクトになります。

{
  "thread_type": "GROUP",
  "tid": "1411911565550430",
  "psid": "1293479104029354",
  "signed_request": "5f8i9XXH2hEaykXHKFvu-E5Nr6QRqN002JO7yl-w_9o.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTUwNDA0NjM4MCwicGFnZV9pZCI6NjgyNDk4MTcxOTQzMTY1LCJwc2lkIjoiMTI1NDQ1OTE1NDY4MjkxOSIsInRocmVhZF90eXBlIjoiVVNFUl9UT19QQUdFIiwidGlkIjoiMTI1NDQ1OTE1NDY4MjkxOSJ9"
}

signed_requestを検証する

ログインや購入などのアクションを実行する前に、getContext()から取得した情報をバックエンドに転送し、検証したい場合もあります。これで、その情報が本当にMessengerから得られたもので、偽装ではないことを確かめられます。

signed_requestはbase64urlでエンコードされており、OAuth 2.0の仕様に基づいてApp SecretのHMACバージョンで署名されています。

次の4つのステップで検証できます。

  1. 署名済みリクエストを「'.'」文字で表区切られる2つの部分に分けます(例: 238fsdfsd.oijdoifjsidf899)。
  2. 最初の部分(エンコードされた署名)をbase64urlエンコーディングからデコードします。
  3. 2つ目の部分(ペイロード)をbase64urlエンコーディングからデコードします。この部分は、必要に応じてサーバー側で使用されます。
  4. HMAC SHA-256と自分のapp secretを使って元のペイロードをハッシュ化し、これが始めに渡されたエンコードされた署名と同じことを確認します。
  5. また、ペイロードにあるissued_atタイムスタンプを検証して、リクエストが新しいことを確認したい場合もあります。

これは、すべてのモダンなプログラミング言語で行えます。PHPでの例は以下のとおりです。

function parse_signed_request($signed_request) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  $secret = "appsecret"; // Use your app secret here

  // Decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  // Confirm the signature
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}

ペイロードをデコードすると、getContext()により始めに返されたのと同じ情報を持つオブジェクトが返されますが、algorithmissued_atpage_idのフィールドが追加されています。

{
  "psid": "1293479104029354", 
  "algorithm": "HMAC-SHA256", 
  "thread_type": "GROUP", 
  "tid": "1411911565550430", 
  "issued_at": 1491351619, 
  "page_id": 167938560376726
}

app secretを誤って開示するのを避けるために、この検証は自分のサーバーで実施し、クライアント側のコードでは行わないようにする必要があります。

グローバルページにスレッドIDを使う

一部のビジネスは、1つのアプリIDやボットに関連付けられた複数のページを持つグローバルページ構造を使っています。 この場合、チャットエクステンションでgetContext()により返されるスレッドIDは、利用者の国によって異なります。

以下のAPIを使って国ページ固有のスレッドIDをグローバルスレッドIDに解決し、そのグローバルスレッドIDを使って、各国の地域ページからチャットエクステンションにアクセスしている利用者の間で状態を維持しています。

グローバルスレッドIDを取得する:

curl -X GET "https://graph.facebook.com/v2.6/{thread-id}?access_token=<PAGE_ACCESS_TOKEN>"
    

応答の例:

    {"tid":1577059318985661,"global_tid":1577059318985661}
  

グローバルページがない場合、global_tidは存在しません。