我有一个 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/