как читать facebook signed_request, чтобы получить user_id

Согласно Facebook — Аутентификация в документе страницы холста, говорится, что мы будем получать signed_request, который состоит из объекта JSON. Теперь говорят, что signed_request можно пройти через $_POST['signed_request'] Согласен, у меня работает.

Теперь, по их словам, если пользователь вошел в систему, я получу значение объекта JSON, подобное этому: -

{
  "expires":UNIXTIME_WHEN_ACCESS_TOKEN_EXPIRES,
  "algorithm":"HMAC-SHA256",
  "issued_at":UNIXTIME_WHEN_REQUEST_WAS_ISSUED,
  "oauth_token":"USER_ACCESS_TOKEN",
  "user_id":"USER_ID",
  "user":{
    "country":"ISO_COUNTRY_CODE",
    "locale":"ISO_LOCALE_CODE",
    ...
  }
}

Теперь я хочу получить user_id из этого, поэтому я использую этот фрагмент кода, но он не работает: -

if(isset($_POST['signed_request']))
{
    echo 'YES';
    $json = $_POST['signed_request'];
    $obj = json_decode($json);
    print $obj->{'user_id'};    
}

Он просто печатает YES. Почему это так?

Я где-то читал, что без аутентификации приложения я не смогу извлечь user_id, но, согласно facebook, это 1-й шаг, а аутентификация приложения будет 4-м. Я новичок в этом, если кто-то может мне помочь, это будет очень полезно. Спасибо.


person Django Anonymous    schedule 15.08.2012    source источник
comment
Если вы сделаете print_r($_POST), что вы увидите?   -  person Brad    schedule 15.08.2012
comment
Что вы на самом деле видите, когда пытаетесь print_r($_POST)?   -  person Brad    schedule 15.08.2012
comment
@Брэд, когда я print_r($_POST['signed_request']); получаю именно это значение cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-k1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI‌​sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB‌​QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV‌​nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG‌​FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN‌​lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf‌​aWQiOiIxNTc2NDU1NjQ5In0   -  person Django Anonymous    schedule 15.08.2012
comment
попробуйте использовать $signed_request = $facebook->getSignedRequest();   -  person Abhishek    schedule 15.08.2012


Ответы (3)


Я думаю, что это не удалось в json_decode($json), потому что $json не является допустимой строкой json, как вы упомянули в комментарии о print_r($_POST['signed_request']);.

Согласно Facebook — Аутентификация в документе страницы холста параметр signed_request закодирован, и анализ строки signed_request даст объект JSON.

если вы используете PHP SDK, как сказал Абхишек в комментарии, $facebook->getSignedRequest(); даст вам декодированный json.

посмотрите здесь для получения более подробной информации о подписанном запросе.

person Chris    schedule 15.08.2012
comment
Эй, могу ли я получить the url с app_id в iframe, чтобы он был открыт на вкладке facebook - person Rohitashv Singhal; 15.07.2013

Если вы не хотите работать с FB SDK, вы можете использовать этот фрагмент кода для получения user_id и других переменных (фрагмент из https://developers.facebook.com/docs/facebook-login/использование-логина-с-играми/)

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

  // 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, '-_', '+/'));
}
person Art Geigel    schedule 21.09.2013
comment
Это очень эффективно и легко реализуемо. Просто будьте осторожны с секретом приложения в коде. - person Mike_K; 09.01.2020
comment
Это сработает. Это также рекомендуется для реализации нового запроса на удаление данных, но это сложно сделать в C#, так как кодировка facebook base64 не является стандартной. - person Marko Prcać; 09.07.2021

Старый пост, который я знаю, но хотел добавить ответ на ответ Арта Гейгеля (я не могу комментировать его напрямую).

В вашем фрагменте кода отсутствует строка,

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

и полный фрагмент,

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, '-_', '+/'));
}

Чтобы ответить на исходный вопрос

Чтобы получить данные из signed_request, включите указанные выше функции и...

$data = parse_signed_request($_POST['signed_request']);

echo '<pre>';
print_r($data);
person Steve    schedule 18.09.2015