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对用户隐私是否正常.
归档时间: |
|
查看次数: |
3975 次 |
最近记录: |