Вечная перезагрузка страницы с помощью Internet Explorer - PullRequest
1 голос
/ 02 ноября 2011

У меня проблема с приложениями FB в Internet Explorer 7.

Я использую этот фрагмент кода, предоставленный FB некоторое время назад:

$auth_url = "http://www.facebook.com/dialog/oauth?client_id=" 
        . FACEBOOK_APP_ID . "&redirect_uri=" . urlencode(CANVAS_PAGE . 'index.php') . "&scope=user_likes,publish_stream";

$signed_request = $_REQUEST["signed_request"];

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

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

// If first time we use the application -> ask for permissions
if (empty($data["user_id"]))
{
    echo("<script> top.location.href='" . $auth_url . "'</script>");
}   
// else display the page code
else
{
    }

Используя этот код, страница загружается правильно, но затем, через 1 секунду, она перезагружается и так далее, поэтому ее невозможно использовать.

Раскомментируя строку

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

проблема решена (кстати, в моем случае код не должен выполнять эту строку ... Странно, что разкомментирование неиспользуемой строки кода решает мою проблему, но в любом случае ...)

После прочтения некоторых форумов у меня сложилось впечатление, что эта проблема связана с заголовком P3P. Поэтому я попытался добавить эту строку:

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

после тега body. Я также попытался добавить его непосредственно перед тегом body и наконец попытался добавить его как метатег:

<meta http-equiv="P3P" content='CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM CURa ADMa PHY ONL COM STA"'>

но ни один из этих 3 вариантов не работал для меня, и мое приложение все еще загружается вечно.

У кого-нибудь есть подсказка?

Заранее спасибо!


Ну, я прочитал несколько форумов, касающихся той же проблемы:

но ни одно из этих решений не помогло мне, у меня все еще есть эта вечная проблема с перезагрузкой страницы.

Я также прочитал форум, который, как я думал, решит мою проблему - http://adamyoung.net/IE-Blocking-iFrame-Cookies - но опять же ... не повезло.

Кто-нибудь может мне помочь ???

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Не удалось заставить ваш код работать, он просто перезагрузился. Кажется, $ _REQUEST ["Sign_request"] никогда не был установлен.

Но я получил его для работы с кодом из http://developers.facebook.com/docs/authentication/

   <?php
   $app_id = "your app id";
   $app_secret = "your app secret";
   $my_url = "your app 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.");
   }

Тем не менее, я бы порекомендовал вам использовать Facebook PHP SDK, http://developers.facebook.com/docs/reference/php/, который облегчает программирование приложений Facebook.

РЕДАКТИРОВАТЬ: с помощью PHP SDK

Для аутентификации с помощью PHP SDK вы должны сделать что-то вроде следующего:

// update this to where you've stored the facebook PHP SDK
require '../src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'your app id',
  'secret' => 'your app secret',
));

$user = $facebook->getUser();
if ($user) {
  print "You've logged in!";
} else {
  echo("<script> top.location.href='" . $facebook->getLoginUrl() . "'</script>");
}

РЕДАКТИРОВАТЬ: заголовки

Также попробуйте установить это в первых строках кода:

ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

Это помогло мне, когда сессия fb иногда терялась в приложении. Обнаружил, что в этом посте: Как правильно обрабатывать токен сеанса и доступа с помощью Facebook PHP SDK 3.0?

1 голос
/ 22 мая 2012

https://gist.github.com/2765933 есть решение в Sinatra / Ruby, которое помогло мне с этой проблемой!

Я обнаружил, что это проблема p3p, я просто хотел опубликовать пример кода для тех, кто находит это после меня.

...