Facebook PHP SDK getSession()无法获得会话。 Cookie问题?

时间:2011-06-07 21:59:04

标签: php facebook session cookies sdk

背景:

  • 使用Facebook PHP SDK v 2.1.2
  • cookieSupport = true
  • Facebook上的App已启用OAvas 2.0 for Canvas
  • Facebook Connect /登录逻辑通过https发布在单独的子域(secure.mysite.com)上
  • 开发站点为dev.mysite.com:PORT_NUM

什么有效

  • 我可以使用Facebook Connect
  • 成功登录
  • 通过Facebook对话授权后,我们签署用户,然后重定向到实例化Facebook类的fbconnect.php并调用$ facebook-> getSession()
  • 返回有效的Facebook会话,我们继续使用post-signIn逻辑
  • 然后我们重定向到已签名的主页

什么行不通

  • 之后的任何时候,$ facebook-> getSession()都会返回NULL。无论如何。
  • 根据文档,Facebook应该基于cookie重新生成有效会话,只要它有效。持续时间设置为默认值1小时,但在设置cookie失败后30秒内完成调用。

我想知道fbs_ cookie中是否存在阻止会话登录后重新生成的内容。与安全子域相关的东西或者我们在开发站点上使用的端口号?

有很多人在Facebook会话中遇到过与我见过的类似问题,但我遇到的建议似乎并没有解决fbs_ cookie,域名,端口等的内容。我的理解这些事情与cookies有什么关系相对较轻,但我想至少将它们视为非问题,以便我可以在其他地方查看。

欣赏任何见解。

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,我开始使用类似以下的内容:

function get_facebook_cookie($app_id, $app_secret) {
 $args = array();
 parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
 ksort($args);
 $payload = '';
 foreach ($args as $key => $value) {
 if ($key != 'sig') {
  $payload .= $key . '=' . $value;
 }
 }
 if (md5($payload . $app_secret) != $args['sig']) {
return null;
}
return $args;
 }
 $cookie = get_facebook_cookie(APP_ID, APP_SECRET);
 $me = json_decode(file_get_contents('https://graph.facebook.com/me?access_token='.$cookie['access_token']));

if ($me) {
echo "Hi ".$me->name;

} else { ?>
<a href="https://www.facebook.com/dialog/oauth?client_id=<?= APP_ID;?>&redirect_uri=<?= REDIRECT_URI ;?>"><img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif"><!--Login with Facebook--></a>

我还包括以下JS

 <div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({appId: '<? echo APP_ID ?>', status: true,
           cookie: true, xfbml: true});
  FB.Event.subscribe('auth.login', function(response) {
    window.location.reload();
  });
</script>

我正在使用像你自己这样的PHP SDK,但是我停止了它不起作用的面孔。我注意到这仍然会在与cookie相关的错误日志中引发一些错误,所以几乎看起来它依赖于JS首先初始化cookie。 SDK的第3版现已上市,所以可能会有所帮助。这之间的唯一区别是我必须在我想要的图形对象上手动调用file_get_contents但是它应该很容易编写一个函数或类来为你做这个

答案 1 :(得分:0)

这个问题随着新的Facebook PHP SDK(v3)而消失了