2011-04-14 78 views
6

我成功使用Facebook SDK(PHP)將用戶連接到我的網站,但我在驗證其帳戶時遇到問題。他們的帳戶已成功通過身份驗證,但由於某種原因我的網站會話已被清除。Facebook API SDK(PHP)清除網站會話

流量:

  • 用戶登錄到我的網站(本地用戶名和密碼)
  • 用戶連接到Facebook在彈出的
  • Facebook的身份驗證的用戶,並返回到我的網站
  • 我的網站會話現在無效(在彈出窗口和主窗口中)導致用戶被註銷

我正在使用Facebook SDK(PHP)和我的網站使用CakePHP框架

任何幫助將不勝感激。

+0

您是使用JavaScript SDK來顯示彈出框還是手動執行操作? – pleasedontbelong 2011-04-14 08:47:04

+0

我正在手動做。我只是使用PHP SDK – bpneal 2011-04-14 09:07:41

回答

1

我找不到了爲什麼會話被重置,因此決定不使用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) { 
     ... 
    } 
} 
1

可能值得檢查Cake安全級別,它可能是做引用檢查(我認爲它在「高」設置,也許是「中等」),這會使會話無效。

+0

感謝Griff,這是我的第一個想法,但我已經嘗試將關卡降低到「低」,仍然會遇到同樣的問題。此外,我以相同的方式使用Twitter API,並且不會產生相同的錯誤。它必須是在Facebook SDK – bpneal 2011-04-14 09:03:55

2

我不能告訴你什麼是刪除您的會話,但你可能想嘗試這(對我的作品)

使用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事件我使用Ajax調用/用戶/ login_fb將使用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會刷新頁面

+0

謝謝,這看起來不錯,但我已決定不再使用SDK進行驗證 – bpneal 2011-04-14 11:53:51

+0

這是一個聰明的做法,看起來很酷kool – Herr 2011-05-10 10:37:08