Почему мое приложение FB зацикливается в IE? - PullRequest
3 голосов
/ 16 августа 2011

У меня есть приложение Facebook, которое зацикливается при запуске в IE. В других браузерах работает нормально.

Мне нужна ваша помощь для отладки, но перед этим мне нужно упомянуть, как я это реализовал.

FB рекомендует, чтобы, когда пользователь пытается получить доступ к приложению, мы перенаправили пользователя на страницу авторизации приложения. Оттуда FB будет перенаправлять (используя код 302) на URL, который нам нравится. В этом случае я прошу FB перенаправить на URL моего приложения с флагом appLogin=1 в строке запроса. Но наряду с этим FB добавляет в строку запроса действительно длинный параметр code, что довольно уродливо. Итак, в этом случае я установил флаг LoggedIn в своем сеансе PHP и перенаправил пользователя обратно на URL приложения, используя код JS window.top.location.href = <app url>. Это очищает URL в адресной строке.

Это прекрасно работает в Firefox и Chrome, но в IE * флаг 1011 * отсутствует в сеансе после перенаправления кода со стадии appLogin. На самом деле, похоже, что сессия PHP в этом случае была сброшена. Это сбивает с толку мое приложение, считая, что это первоначальный запрос, поэтому оно перенаправляет пользователя на страницу авторизации.

Надеюсь, вышесказанное имеет смысл. Действительно ценю любое понимание.

Update1:

По запросу. Вот фрагмент кода.

$reset = false;
$topRedirect = true;

if (isset($_REQUEST['appLogin'])) {
    resetSession();
}
session_start();

$facebook = new Facebook(array(
  'appId' => $AppId,
  'secret' => $AppSecret,
  'cookie' => true,
));

if (isset($_REQUEST['appLogin'])) {//Comes here when appLogin is set, i.e. we have just been redirected here from OAuth (authorization) page.

    if (isset($_REQUEST['error'])) {
        if ($_REQUEST['error_reason'] === 'user_denied') {
            $msg = "You need to click on 'Allow', so that this App can fetch the data needed.";
            $allowRetry = true;
            include('error.php');
        }
    }

    $authToken = $facebook->getUserAccessToken(); //This was originally protected. Made public for my purpose.
    if ($authToken === false) {
        //If no user token found and it wasn't even an error then this is totally unexpected.
        $msg = "Totally unexpected error occurred!";
        $allowRetry = true;
        logErr($msg);
        include('error.php');
    }

    $_SESSION['LoggedIn'] = 1;
    $reset = false;
    $url = $AppUrl; //We redirect again to clean the url.
    include('redirect.php');
} else {
    if (!isset($_SESSION['LoggedIn']) || $facebook->getUserAccessToken() === false) {
        //If we are here then this is an initial request.
        $reset = false;
        $url = $OAuthUrl;
        include('redirect.php');
    }
}

$accessToken = $facebook->getAccessToken();

Update2:

Включенные файлы - redirect.php и error.php вызывают exit(), когда их обработка завершена. Поэтому код после них не будет выполнен.

Ответы [ 2 ]

20 голосов
/ 16 августа 2011

Это проблема с перенаправлениями. IE обрабатывает их по-разному.

Это можно решить с помощью простой политики P3P HTTP-заголовок, который можно отправить:

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

В PHP это будет:

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

Причина в том, что IE требует использования политик P3P при использовании фреймов, поскольку ваше приложение работает внутри iframe, а его родительский элемент принадлежит другому домену (в данном случае Facebook.com), тогда файлы cookie не будут работать (если политики P3P не используются. устанавливается). А так как куки не будут работать, то вы, вероятно, зациклены на своих перенаправлениях, используемых для входа в Facebook.

Решение: необходимо реализовать заголовок P3P, чтобы сообщить браузеру, что файлы cookie для вашего приложения в iframe подходят для конфиденциальности пользователя.

1 голос
/ 20 августа 2011

Я заметил кое-что еще в вашем коде. Вам не нужна запятая после 'cookie' => true. Это все испортит в IE.

...