Facebook API SDK(PHP)清除站点会话

Facebook API SDK(PHP)清除站点会话,php,session,cakephp,session-cookies,facebook-php-sdk,Php,Session,Cakephp,Session Cookies,Facebook Php Sdk,我正在成功地使用Facebook SDK(PHP)将用户连接到我的网站,但当他们验证他们的帐户时,我遇到了问题。他们的帐户已成功通过身份验证,但由于某些原因,我的站点的会话已被清除 流量: 用户登录我的站点(本地用户名和密码) 用户在弹出窗口中连接到Facebook Facebook验证用户身份并返回到我的网站 “我的站点”会话现在无效(在弹出窗口和主窗口中),导致用户注销 我使用的是Facebook SDK(PHP),我的网站使用的是CakePHP框架 任何帮助都将不胜感激。可能值得检查C

我正在成功地使用Facebook SDK(PHP)将用户连接到我的网站,但当他们验证他们的帐户时,我遇到了问题。他们的帐户已成功通过身份验证,但由于某些原因,我的站点的会话已被清除

流量:

  • 用户登录我的站点(本地用户名和密码)
  • 用户在弹出窗口中连接到Facebook
  • Facebook验证用户身份并返回到我的网站
  • “我的站点”会话现在无效(在弹出窗口和主窗口中),导致用户注销
我使用的是Facebook SDK(PHP),我的网站使用的是CakePHP框架


任何帮助都将不胜感激。

可能值得检查Cake安全级别,它可能会执行推荐人检查(我认为它在“高”设置下执行此操作,也可能在“中”设置下执行此操作),这将使会话无效。

我无法告诉您删除会话的原因,但您可能想尝试一下(适合我)

使用Javascript SDK显示登录按钮,打开弹出窗口连接到FB

将js SDK添加到页面,如下所示:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({appId: '<?php echo FB_API_ID; ?>', status: true, cookie: true, xfbml: true});
    FB.Event.subscribe('auth.login', function() {
        new Request({
            'method': 'get',
            'url': '<?php echo $this->Html->url(array('controller'=>'users','action'=>'login_fb'));?>',
            'onSuccess': function(result){
                window.location.reload();       
            }
        }).send();
  });
  };
  (function() {
    var e = document.createElement('script'); e.async = true;
    e.src = document.location.protocol +
      '//connect.facebook.net/en_US/all.js';
    document.getElementById('fb-root').appendChild(e);
  }());
</script>

主要思想是。。在js中,我调用ajax检查fb会话,然后将其保存在cake会话中,js将刷新页面

我无法找到会话被重置的原因,因此决定不使用SDK进行身份验证。这是我用的

$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null);

if (empty ($code)) {
    $dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope);
    header('Location: ' . $dialogUrl);
    die;
}
else {
    $tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code;
    $accessToken = file_get_contents($tokenUrl);

    $this->Session->write('facebookAccessToken', $accessToken);

    $graphUrl = 'https://graph.facebook.com/me?' . $accessToken;
    $fbUser = json_decode(file_get_contents($graphUrl));

    if ($fbUser) {
        ...
    }
}

您是使用Javascript SDK显示弹出窗口还是手动执行?我是手动执行。我只是在使用PHPSdkthanks Griff,这是我的第一个想法,但我尝试将级别降低到“低”,仍然会遇到同样的问题。我也以同样的方式使用Twitter API,这不会产生同样的错误。这一定是Facebook SDK中的东西,看起来不错,但我决定不再使用SDK进行身份验证。这是一种聪明的方法,看起来很酷
$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null);

if (empty ($code)) {
    $dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope);
    header('Location: ' . $dialogUrl);
    die;
}
else {
    $tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code;
    $accessToken = file_get_contents($tokenUrl);

    $this->Session->write('facebookAccessToken', $accessToken);

    $graphUrl = 'https://graph.facebook.com/me?' . $accessToken;
    $fbUser = json_decode(file_get_contents($graphUrl));

    if ($fbUser) {
        ...
    }
}