为什么我的FB应用程序永远在IE中循环?

App*_*rew 3 javascript php internet-explorer facebook infinite-loop

我有一个Facebook应用程序,它在IE中运行时永远循环.在其他浏览器中它工作正常.

我需要你的帮助来调试这个,但在此之前我需要提一下我是如何实现它的.

FB建议当用户尝试访问应用程序时,我们应该将用户重定向到应用程序授权页面.从那里FB将重定向(使用302代码)到我们喜欢的网址.在这种情况下,我要求FB重定向到我的应用程序的URL appLogin=1,查询字符串中有一个标志.但是,随着FB code在查询字符串中附加一个非常长的参数,这非常难看.因此,在这种情况下,我LoggedIn在PHP会话中放置了一个标志,并使用JS代码将用户重定向回应用程序URL window.top.location.href = <app url>.这会清除位置栏中的URL.

这在Firefox和Chrome中运行良好,但在LoggedIn代码从appLogin舞台重定向后,会话中缺少IE 标志.事实上,在这种情况下,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();
Run Code Online (Sandbox Code Playgroud)

UPDATE2:

包含的文件 - redirect.php和error.php exit()在完成处理时调用.所以他们之后的代码不会被执行.

Pab*_*ruz 20

这是重定向的问题.IE处理它们的方式不同

您可以使用可以发送的简单P3P策略 HTTP标头来解决这个问题:

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Run Code Online (Sandbox Code Playgroud)

在PHP中,那将是:

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

原因是IE在使用框架时需要P3P策略,因为您的应用程序在iframe内部运行且其父级属于不同的域(这种情况下为Facebook.com),因此cookie将不起作用(除非正在设置P3P策略) .由于cookie不起作用,那么您可能正在使用用于登录Facebook的重定向进行循环.

解决方案:需要实现P3P标头告诉浏览器iframe中的应用程序的cookie对用户隐私是否正常.