Вечная перезагрузка страницы с Internet Explorer

У меня проблема с моими приложениями 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"'>

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

Кто-нибудь знает?

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


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

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

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

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


person thomaus    schedule 02.11.2011    source источник
comment
если вы сделаете print_r($data); вместо редиректа что вы получаете?   -  person fredrik    schedule 08.11.2011
comment
В этом случае ничего не происходит. Если я раскомментирую эту строку: echo(‹script› top.location.href=' . $auth_url . '‹/script›); ошибка исправлена. Проблема в том, что мне абсолютно необходима эта строка для диалога аутентификации, когда пользователь впервые входит в мое приложение.   -  person thomaus    schedule 08.11.2011
comment
да, кажется, что вы не получаете ответ после возврата из диалогового окна авторизации. Попробуйте напечатать $_REQUEST[signed_request]; и посмотреть, есть ли что-нибудь в этом.   -  person fredrik    schedule 08.11.2011
comment
Может быть, я был неясен. Если I выход $ данных я получаю: Array ([Алгоритм] => HMAC-SHA256 [истекает] => 1320771600 [issued_at] => 1320767183 [oauth_token] => AAAC13ErcOq0BACZAxxabgZADUHq3aEcNdBopCZBZAPLgVTMXFz1g25ZBqr1WbEsX5QWXnsqLwIPVlAxWbIyHC6cGOvx5qDZBlNi5knz9rORAZDZD [пользователь] => Array ([Страна] => эс [ locale] => en_US [возраст] => Массив ( [мин] => 21 ) ) [user_id] => 719597603 )   -  person thomaus    schedule 08.11.2011
comment
И если я отправлю подписанный запрос, я получу подписанный запрос, который, кажется, в порядке. Я думал, вы хотите, чтобы я сделал print_r($data) вместо строки перенаправления. В этом случае, как я уже сказал, я ничего не получаю, что нормально: скрипт не может войти в условие if (empty($data[user_id])) , так как $data['user_id'] НЕ пусто. Но если я оставлю echo(‹script› top.location.href=' . $auth_url . '‹/script›); строка, то скрипт ломается. Я никогда не видел ничего настолько странного!   -  person thomaus    schedule 08.11.2011
comment
и это происходит только в IE7? не имеет смысла: P вы уверены, что $data[user_id] установлен, когда вы используете IE7? попробую это настроить   -  person fredrik    schedule 09.11.2011
comment
Не могли бы вы проверить, не вызвано ли это двойной загрузкой страницы в iframe, один раз без подписанного запроса. Я сталкивался с этой ошибкой раньше, но никогда не пытался проверить это   -  person DannyKK    schedule 09.11.2011
comment
Забудьте о P3P и других файлах cookie, они не имеют никакого отношения к этому коду. Но просто для ясности: вы говорите, что если вы напечатаете_r($data) непосредственно перед тестом empty, вы увидите элемент массива с именем user_id, но условие все равно выполняется? И это происходит только в IE? Это действительно кажется невозможным... код, который вы показали, действительно все, что есть? Что изменится, если вы поместите оператор exit; сразу после строки echo?   -  person Floyd Wilburn    schedule 09.11.2011


Ответы (2)


Не удалось заставить ваш код работать, он просто перезагрузился. Кажется, $_REQUEST["signed_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.

EDIT: использование 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?

person fredrik    schedule 08.11.2011
comment
Привет, спасибо БОЛЬШОЕ. 2 последнее: 1) Используя это решение, я всегда получаю состояние не соответствует. Вы можете стать жертвой CSRF. сообщение. Кажется, что $_SESSION всегда пуст. это сказало, это работает в любом случае. 2) Не могли бы вы предоставить мне фрагмент кода для отображения диалогового окна разрешений с помощью PHP SDK? - person thomaus; 09.11.2011
comment
рад, что смог помочь, я также добавил, как пройти аутентификацию с помощью PHP SDK. Не знаю, почему у вас не работает $_SESSION. Вы можете установить что-нибудь в сеансе? - person fredrik; 09.11.2011

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

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

person rylanb    schedule 22.05.2012