我有一个 Facebook 应用程序,在 IE 中运行时会永远循环。在其他浏览器中它工作正常。
我需要你的帮助来调试它,但在此之前我需要提及我是如何实现它的。
FB 建议当用户尝试访问应用程序时,我们应该将用户重定向到应用程序授权页面。从那里 FB 将重定向(使用 302 代码)到我们喜欢的 URL。在这种情况下,我要求 FB 使用标志重定向到我的应用程序的网址appLogin=1
在查询字符串中。但与此同时,FB 附加了一个很长的参数code
在查询字符串中,这非常难看。所以,在这种情况下我放了一个标志LoggedIn
在我的 PHP 会话中,并使用 JS 代码将用户重定向回应用程序 urlwindow.top.location.href = <app url>
。这会清除地址栏中的网址。
这在 Firefox 和 Chrome 中运行良好,但在 IE 中运行良好LoggedIn
代码重定向后,会话中缺少标志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()
当他们的处理完成时。所以他们后面的代码不会被执行。
这是重定向的问题。 IE 以不同的方式处理它们。
你可以用一个简单的方法来解决这个问题P3P政策 http://en.wikipedia.org/wiki/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 策略) 。由于 cookie 不起作用,那么您可能会循环使用用于登录 Facebook 的重定向。
解决方案:需要实现 P3P 标头来告诉浏览器 iframe 内应用程序的 cookie 可以保护用户隐私。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)