Почему мое тестовое приложение находится в бесконечном цикле перенаправления? - PullRequest
3 голосов
/ 29 февраля 2012

Я использую PHP SDK версии 3.1.1 для простого вызова Graph API.Я запускаю его локально на http://local.fb -sandbox .В настройках приложения Facebook указан URL-адрес сайта http://local.fb -sandbox / .

. Я перенаправлен на страницу входа в Facebook, а затем на страницу, запрашивающую мое разрешение при переходе на http://local.fb -sandbox , но затем приложение переходит в цикл перенаправления между URL-адресами, такими как:

http://local.fb-sandbox/?state=e9c091bb61afe08139af4e3b153a1e9e&code=AQBDJ4yMWVOIrukx6nRkxhNbnPH9nX6OvuqOWhVJEAgLkq6Lz27iq_-B6AIAGQ_cOpBIZktCPLLs_G5Hpt8QO5PRhDUN8l-Yu3JuT0YTzwVQiAqBlgutgia60lRT-ZzE3IHguStHq4gtuPQYJh423TBer-mB8BsqERvNsoF1L4NNe90WAWU8--MFAU3Oc4eeXyI#_=_

и

https://www.facebook.com/dialog/oauth?client_id=375741229103324&redirect_uri=http%3A%2F%2Flocal.fb-sandbox%2F%3Fstate%3Dccd13778febb68d3eb1f4763a99b2ace%26code%3DAQBFegtkch4m34-2F9KMKgScrPhWzI0qeKJlvnM6uAD81BYm2xakv0S7DEbUrNwlECrgth5-YHdT8IR_vCBzW29QMh3ecOiiEk7P03wQG2V2gaxAUsMqOOZvTl_Oq3SefiLn9BvBAPQSGXQdRSZBVdsUqDT1aZ430Lcx8Ic6axaHSyHwlkkNK5EjRhYdkjYYz0YmENk64kRf4tvmX4WrH6f4&state=19a3862962dd0422628eb7c28a832380&scope=email%2Cread_stream%2Cpublish_stream%2Cuser_photos%2Cuser_videos&fbconnect=1#_=_

У меня есть вызов session_start () в верхней части моего сценария и пробовал как с, так и без него.Файл cookie PHP настроен нормально.

Я видел много подобных вопросов здесь относительно этого цикла перенаправления, но ни один из предложенных ответов не решил его, и все они довольно старые.Должно ли это работать на localhost?Я пропустил настройку приложения в настройках приложения на Facebook?

ОБНОВЛЕНИЕ

Так что, если вы используете код здесь: http://developers.facebook.com/docs/authentication/, то это работает.Пример php-sdk на github полностью игнорирует это и не включает в себя тот факт, что вам нужно проверить, установлен ли «код», и сгенерировать свой собственный токен CSRF.Затем вам нужно сделать вызов, чтобы получить токен доступа, прежде чем вы сможете сделать вызов API Graph.

Кроме того, метод getLoginURL () SDK возвращает URL-адрес https: //, который не кажетсяработать.Если я создаю свой собственный URL, то он работает.

РАБОЧИЙ КОД:

if(empty($code)) {
    $_SESSION['state'] = md5(uniqid(rand(), TRUE));
$login_url_params = array(
      'scope' => 'email,read_stream,publish_stream,user_photos,user_videos',
      'fbconnect' =>  1,
      'redirect_uri' => 'http://local.fb-sandbox/',
'state'=>$_SESSION['state']
   ); //using this array via the sdk does not work

    $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state']; //this url works

    //var_dump($dialog_url);echo "<br />";
    $login_url = $facebook->getLoginUrl();
    //var_dump($login_url);
    header("Location:{$dialog_url}");//works
    //header("Location:{$login_url}");//does not work
    exit;
}



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;
$aContext = array(
    'http' => array(
        'proxy' => 'tcp://xxxx0:80',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);
      $response = file_get_contents($token_url, FALSE, $cxContext);

      $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, FALSE, $cxContext));
      //var_dump($user);exit;
}

//var_dump($user);exit;
  return $app->render('test.html',array('myvar', $user));
  exit();

Обратите внимание, что я прохожу через прокси, поэтомуустановить контекст для вызовов file_get_contents ().

Если кто-нибудь сможет преобразовать мой код в надлежащие методы SDK и заставить его работать (учитывая, что он мне нужен для работы за прокси-сервером), вы получите вознаграждение.

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Многие из различных серверных SDK Facebook не обрабатывают аутентификацию в соответствии с документацией и рекомендациями, которыми Facebook поделился за последние 3 или 4 месяца.Вы нашли один хороший пример этого в том, как PHP SDK использует (или не использует) параметр кода.Существуют и другие примеры, такие как SDK, непосредственно читающие куки-файлы Facebook, но инженеры Facebook говорят разработчикам, что им не следует этого делать, поскольку куки-файлы - это просто «деталь реализации», а разработчики вне Facebook не должны создавать зависимости.

Я не уверен, откуда вы взяли этот код в своем примере рабочего кода, но я не смог найти поддержки для включения таких параметров, как fbconnect=1

Так, учитывая, что SDK не реализует аутентификацию согласно рекомендациям Facebookи документации, и что Facebook предоставил полную реализацию PHP в своей документации, я рекомендую вам просто использовать версию, которую Facebook предоставляет, скопируйте и вставьте сюда для вашей справки с этой страницы http://developers.facebook.com/docs/authentication/:

     <?php 

       $app_id = "YOUR_APP_ID";
       $app_secret = "YOUR_APP_SECRET";
       $my_url = "YOUR_URL";

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

       if(empty($code)) {
         $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
         $dialog_url = "http://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.");
       }

     ?>
1 голос
/ 29 февраля 2012

Есть несколько проблем с этим.

  1. Ваш redirect_uri должен быть похож на http://local.fb -sandbox / . В конце должна быть косая черта - как в коде, так и в настройках приложения facebook в developers.facebook.com.

  2. Вы должны использовать uurlencode для redirect_uri.

  3. Не используйте $ _SERVER ['REQUEST_URI'] в redirect_uri. Найдите способ добавить любые параметры, которые вам нужны, обработав app_data или добавив их в зависимости от вашего путешествия пользователя.

В качестве начала замените эту строку:

'redirect_uri' => urlencode('http://local.fb-sandbox/'),

и экспериментируйте с добавлением параметров позже.

...