【问题标题】:Eternal reloading page with Internet Explorer使用 Internet Explorer 的永恒重新加载页面
【发布时间】:2011-12-20 13:32:49
【问题描述】:

我在使用 Internet Explorer 7 时遇到问题。

我正在使用FB前段时间提供的这段代码:

$auth_url = "http://www.facebook.com/dialog/oauth?client_id=" 
        . FACEBOOK_APP_ID . "&redirect_uri=" . urlencode(CANVAS_PAGE . 'index.php') . "&scope=user_likes,publish_stream";

$signed_request = $_REQUEST["signed_request"];

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

// If first time we use the application -> ask for permissions
if (empty($data["user_id"]))
{
    echo("<script> top.location.href='" . $auth_url . "'</script>");
}   
// else display the page code
else
{
    }

使用此代码,页面可以正确加载,但 1 秒后,它会重新加载,依此类推,因此无法使用。

取消注释

    echo("<script> top.location.href='" . $auth_url . "'</script>");

问题解决了(顺便说一句,在我的情况下,代码不应该执行这一行......这很奇怪,取消注释未使用的代码行解决了我的问题,但无论如何......)

看了一些论坛,我的印象是这个问题是一个P3P头相关的问题。所以我尝试添加这一行:

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

在body标签之后。我也尝试在body标签之前添加它,最后我尝试将它添加为元标签:

<meta http-equiv="P3P" content='CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM CURa ADMa PHY ONL COM STA"'>

但是这 3 个选项都不适合我,而且我的应用仍然会永远加载。

有人知道吗?

提前致谢!


好吧,我阅读了一些与相同问题相关的论坛:

但是这些解决方案都不适合我,我仍然有这个永恒的重新加载页面问题。

我还阅读了一个我认为可以解决我的问题的论坛 - http://adamyoung.net/IE-Blocking-iFrame-Cookies - 但又一次......运气不好。

谁能帮帮我???

【问题讨论】:

  • 如果你做一个 print_r($data);而不是重定向,你得到了什么?
  • 在这种情况下没有任何反应。如果我取消注释这一行: echo("");该错误已修复。问题是,当用户第一次进入我的应用程序时,我绝对需要在 Auth 对话框中使用这一行。
  • 是的,从身份验证对话框返回后,您似乎没有得到回复。尝试打印 $_REQUEST["signed_request"];看看里面有没有什么。
  • 也许我不清楚。如果我输出$数据获取:阵列([算法] => HMAC-SHA256 [到期] => 1320771600 [issued_at] => 1320767183 [组oauth_token] => AAAC13ErcOq0BACZAxxabgZADUHq3aEcNdBopCZBZAPLgVTMXFz1g25ZBqr1WbEsX5QWXnsqLwIPVlAxWbIyHC6cGOvx5qDZBlNi5knz9rORAZDZD [用户] =>数组([国家] => ES [ locale] => en_US [age] => Array ([min] => 21)) [user_id] => 719597603)
  • 如果我发出签名请求,我会收到一个似乎没问题的签名请求。我以为你想让我做一个 print_r($data) 而不是重定向行。在这种情况下,正如我所说,我没有得到任何东西,这很正常:脚本应该不可能进入“if (empty($data["user_id"]))”条件,因为 $data[ 'user_id'] 不为空。但是如果我离开 "echo("");"行,然后脚本被破坏。我从来没有见过这么奇怪的东西!

标签: facebook internet-explorer-7 load p3p


【解决方案1】:

也无法让您的代码工作,它只是重新加载。似乎从未设置过 $_REQUEST["signed_request"]。

但我可以使用来自http://developers.facebook.com/docs/authentication/的代码

   <?php
   $app_id = "your app id";
   $app_secret = "your app secret";
   $my_url = "your app url";

   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'];

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     echo("Hello " . $user->name);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

也就是说,我建议您使用 Facebook PHP SDK,http://developers.facebook.com/docs/reference/php/,它使 Facebook 应用程序的编程变得更加容易。

编辑:使用 PHP SDK

要使用 PHP SDK 进行身份验证,您需要执行以下操作:

// update this to where you've stored the facebook PHP SDK
require '../src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'your app id',
  'secret' => 'your app secret',
));

$user = $facebook->getUser();
if ($user) {
  print "You've logged in!";
} else {
  echo("<script> top.location.href='" . $facebook->getLoginUrl() . "'</script>");
}

编辑:标题

另外,请尝试在代码的第一行中进行设置:

ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

当 Facebook 会话有时在应用程序中丢失时,这对我很有帮助。在这篇文章中发现: How to properly handle session and access token with Facebook PHP SDK 3.0?

【讨论】:

  • 嗨,谢谢你这么多。 2最后一件事:1)使用这个解决方案,我总是得到“状态不匹配。你可能是CSRF的受害者。”信息。似乎 $_SESSION 总是空的。这就是说,它仍然有效。 2) 能否请您提供一段代码来使用 PHP SDK 显示权限对话框?
  • 很高兴我能提供帮助,我还添加了如何使用 PHP SDK 进行身份验证。不知道为什么 $_SESSION 不适合你。您可以在会话中设置任何内容吗?
【解决方案2】:

https://gist.github.com/2765933 在 Sinatra/Ruby 中有一个解决方案,可以帮助我解决这个问题!

我发现它是 p3p 问题,我只是想为在我之后发现此问题的任何人发布一些示例代码。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2012-11-16
    • 2012-10-20
    • 2014-12-02
    相关资源
    最近更新 更多