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

Posted

技术标签:

【中文标题】Facebook API SDK (PHP) 清除站点会话【英文标题】:Facebook API SDK (PHP) clearing site sessions 【发布时间】:2011-08-05 08:36:11 【问题描述】:

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

流程:

用户登录我的站点(本地用户名和密码) 用户在弹出窗口中连接到 Facebook Facebook 对用户进行身份验证并返回我的网站 我的站点会话现在无效(在弹出窗口和主窗口中)导致用户退出

我使用的是 Facebook SDK (PHP),我的网站使用的是 CakePHP 框架

任何帮助将不胜感激。

【问题讨论】:

您是使用 javascript SDK 来显示弹出窗口还是手动操作? 我是手动做的。我只是在使用 PHP SDK 【参考方案1】:

我无法告诉你是什么删除了你的会话,但你可能想试试这个(对我有用)

使用 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>

auth.login 事件中,我使用了对 /users/login_fb 的 ajax 调用,它将使用 Facebook SDK 检查 Facebook 会话:

    App::import('Lib', 'facebook_sdk/facebook');
    // "MyAuth" is a custom Auth Component that extends the normal Auth component
    $this->MyAuth->facebook = new Facebook(array(
      'appId'  => FB_API_ID,
      'secret' => FB_SECRET,
      'cookie' => true,
    ));

    $me = null;
    $session = $this->MyAuth->facebook->getSession();
    if ($session) 
      try 
        $uid = $this->MyAuth->facebook->getUser();
        $me = $this->MyAuth->facebook->api('/me');
       catch (FacebookApiException $e) 
        error_log($e);
      
    

    if ($me) 
        $this->Session->write('FbLogin.session',$session);
        $this->Session->write('FbLogin.user',$me);
        $UserModel = ClassRegistry::init('User');
        $user = $UserModel->findByUid($me['id']);
        if(!$user)
            $UserModel->create();
            $user_data = array( 'username'=>$me['username'],
                        'name'=>$me['first_name'],
                        'lastname'=>$me['last_name'],
                        'email'=>$me['email'],
                        'group_id'=>GROUP_VISITOR,
                        'uid'=>$me['id']
                        );
            $UserModel->save($user_data);
            $user['User']['id'] = $UserModel->id;
         
        $this->Session->write($this->MyAuth->sessionKey, $user['User']);
        $this->MyAuth->_loggedIn = true;
        

主要思想是..在js中我调用一个ajax来检查fb会话,然后将它保存在蛋糕会话中,js会刷新页面

【讨论】:

谢谢,这看起来不错,但我决定不再使用 SDK 进行身份验证 这是一个聪明的方法,看起来很酷【参考方案2】:

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

【讨论】:

感谢 Griff,这是我的第一个想法,但我尝试将级别降低到“低”,但仍然遇到同样的问题。我也以同样的方式使用 Twitter API,这不会产生同样的错误。它必须是 Facebook SDK 中的东西【参考方案3】:

我无法找出会话被重置的原因,因此决定不使用 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) 
        ...
    

【讨论】:

以上是关于Facebook API SDK (PHP) 清除站点会话的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Graph API 的 PHP SDK 访问 Facebook 事件的 RSVP 列表

Facebook PHP SDK Graph API - 是不是可以访问 PAST 事件?

处理访问令牌的 Facebook PHP SDK

使用 Facebook PHP SDK API 的意外应用程序 ID

从 facebook API 保存用户的个人资料图片 - PHP SDK V.5

使用 Facebook PHP SDK 4,但没有存储会话