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

标签 php javascript facebook internet-explorer infinite-loop

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

我需要你的帮助来调试它,但在此之前我需要说明我是如何实现它的。

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

这在 Firefox 和 Chrome 中工作正常,但在 IE 中 LoggedIn代码从 appLogin 重定向后, session 中缺少标志阶段。事实上,在这种情况下,PHP session 似乎已重置。这让我的应用误以为这是一个初始请求,因此它将用户重定向到授权页面。

我希望以上是有道理的。非常感谢任何见解。

更新1:

根据要求。这是代码片段。

$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();

更新2:

包含的文件 - redirect.php 和 error.php 调用 exit()当他们的处理完成时。因此它们之后的代码将不会被执行。

最佳答案

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

你可以用一个简单的 P3P policy 来解决这个问题您可以发送的 HTTP header :

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 策略是正在设置)。由于 cookie 不起作用,因此您可能正在循环使用用于登录 Facebook 的重定向。

解决方案:需要实现 P3P header 以告知浏览器您的应用程序在 iframe 中的 cookie 可以保护用户隐私。

关于php - 为什么我的 FB 应用程序在 IE 中永远循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083738/

相关文章:

php - 如何从一个表行中获取两个结果行

php - mysql中将行转换为列

php - Laravel 为什么数据透视表是空的?

javascript - 无法使用 ng-repeat 访问内部对象数组

javascript - WebPack: Uncaught ReferenceError :BrotliBitReader 未定义

ios - 使用 xCode 登录 Facebook 的 Phonegap 3.0 应用程序

javascript - Uncaught ReferenceError : getPrice is not defined

javascript - 如果我在创建 Jquery 弹出框时需要大量 id 和类,正确的解决方案是什么?

java - Facebook Android 开放图谱

python - AppEngine Python 上的 Facebook "Login"(OAuth2)