1

我的 FB 应用程序在 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"'>

但是这三个选项都不适合我,我的应用程序仍然会永远加载。

有人有线索吗?

提前致谢!


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

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

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

有谁能够帮助我???

4

2 回答 2

3

也无法让你的代码工作,它只是重新加载。似乎 $_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"');

当 fb 会话有时在应用程序中丢失时,这对我很有帮助。在这篇文章中发现: 如何使用 Facebook PHP SDK 3.0 正确处理会话和访问令牌?

于 2011-11-08T22:31:09.053 回答
1

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

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

于 2012-05-22T01:24:33.897 回答