Как получить данные пользователя программно, через аутентификацию facebook?

Я могу вручную получить данные пользователя, но не программно.

Использование кода на стороне сервера в том виде, в каком он есть, из - https://developers.facebook.com/docs/authentication/

 <?php 

 $app_id = "MY_APP_ID";
 $app_secret = "MY_APP_SECRET";
 $my_url = "ADDRESS_OF_CURRENT_PAGE";

 session_start();
 $code = $_REQUEST["code"];

 if(empty($code)) {
   $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
   $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
     . $_SESSION['state'];

   echo("<script> top.location.href='" . $dialog_url . "'</script>");
 }

 if($_REQUEST['state'] == $_SESSION['state']) {
   $token_url = "https://graph.facebook.com/oauth/access_token?"
   . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
   . "&client_secret=" . $app_secret . "&code=" . $code;

   $response = @file_get_contents($token_url);
   $params = null;
   parse_str($response, $params);

   $graph_url = "https://graph.facebook.com/me?access_token=" 
     . $params['access_token'];

   $user = json_decode(file_get_contents($graph_url));
   echo("Hello " . $user->name);
 }
 else {
   echo("The state does not match. You may be a victim of CSRF.");
 }

 ?>

Вывод только Привет, имя пользователя не отображается!

Я думаю, что проблема связана с file_get_contents(), поскольку эхо-ответ $response не имеет вывода, тогда как $token_url имеет соответствующее значение.

   $response = @file_get_contents($token_url);
  • Версия PHP = 5.2.9
  • Отчеты об ошибках отключены, но включив это в код - error_reporting(E_ALL); не дает выхода.

ОБНОВЛЕНИЕ. Итак, я попробовал это через 6 месяцев, и это сработало. Единственное, что изменилось с тех пор, это мой хостинг. Раньше я использовал HostBig. Урок. Не полагайтесь на услуги хостинга за 1 доллар в месяц, им нельзя доверять.


person Akshay Tyagi    schedule 03.12.2011    source источник
comment
Хм, а ты пробовал без @? Это подавление ошибок.   -  person finity    schedule 03.12.2011
comment
Одна проблема, с которой я сталкивался в прошлом при работе с file_get_contents, заключается в том, что он не дает вам фактических данных ответа веб-сервера, когда заголовки ответа содержат ошибку. Принимая во внимание, что браузеры обычно отображают ответ. Это просто не облегчает отладку.   -  person finity    schedule 03.12.2011
comment
@finity Я пробовал без '@'. На самом деле, я пробовал множество перестановок/комбинаций этого кода в течение нескольких часов! Ничего не работает. Могу ли я избежать функции file_get_contents и использовать вместо нее что-то другое?   -  person Akshay Tyagi    schedule 03.12.2011
comment
Да, вы можете использовать curl - ссылка. Несколько месяцев назад я написал приложение для Facebook и потратил кучу времени на его отладку. В какой-то момент Facebook просто перестал отвечать на мои запросы, и через несколько дней я узнал, что это была ошибка, которая поразила около 100 разработчиков. Очень расстраивает. Вы используете другую схему аутентификации, чем я — моя работала как приложение на основе холста, поэтому Facebook отправлял мне access_token каждый раз, когда пользователь просматривал мою страницу. file_get_contents хорошо сработало для меня, но, возможно, curl может дать вам больше полезной информации об отладке.   -  person finity    schedule 03.12.2011


Ответы (2)


Вы пытаетесь запустить этот код с локального хоста? Если да, то работать не будет. При регистрации приложения на Facebook вы должны были войти на веб-сайт своего приложения. Загрузите скрипт на сервер, отредактируйте свой app_id, секрет и URL-адрес скрипта. Затем попробуйте выполнить его.

Если даже тогда это не сработает, попробуйте повторить свои $dialog_url и $token_url. Сначала вручную скопируйте и вставьте свой $dialog_url в браузер и посмотрите, какую ошибку он выдает. Если он запрашивает аутентификацию, аутентифицируйте свое приложение. Это вернет вас на страницу. Затем попробуйте запустить $token_url в браузере. Это даст вам точный ответ, который предоставляет вам сервер.

person Nishchay Sharma    schedule 03.12.2011
comment
Я работаю на сервере. И, как я уже сказал, когда я повторяю $token_url и вставляю его в адресную строку, я получаю токен и срок действия. Я также использовал этот токен для получения информации с графика таким же образом. - person Akshay Tyagi; 03.12.2011

Итак, я попробовал это через 6 месяцев, и это сработало. Единственное, что изменилось с тех пор, это мой хостинг. Раньше я использовал HostBig.

Вероятно, что-то не так с конфигурацией PHP HostBig, которая отключила функцию file_get_contents().

ОБНОВЛЕНИЕ. Я поговорил с ребятами из HostBig, и они сказали мне, что отключили allow_url_fopen из соображений безопасности и предложили cURL как более безопасную альтернативу.

person Akshay Tyagi    schedule 22.06.2012