2016-03-14 60 views
0

我試圖建立什麼本質上是使用Facebook Login日誌使用戶登錄到網站。用戶可以使用JavaScript SDK(如文檔中所建議的)登錄,然後我需要在服務器端獲取用戶詳細信息,以便我可以爲用戶在數據庫中存儲日記條目(使用Facebook用戶標識來標識用戶)。我正嘗試使用getJavaScriptHelper()在PHP SDK v5中執行此操作。Facebook的PHP SDK v5訪問令牌/工作流程

我對如何正確處理/存儲訪問令牌有些困惑。到目前爲止,我有這個(我已經削減了簡潔try/catch位):(?可能會失效的問題)

$fb = new Facebook\Facebook([ 
    'app_id' => $APP_ID, 
    'app_secret' => $APP_SECRET, 
    'default_graph_version' => 'v2.5', 
]); 

$helper = $fb->getJavaScriptHelper(); 
$accessToken = $helper->getAccessToken(); 

if (isset($accessToken)) { 
    $oAuth2Client = $fb->getOAuth2Client(); 
    $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); 
    $fb->setDefaultAccessToken($longLivedAccessToken); 
    $response = $fb->get('/me'); 
    $userNode = $response->getGraphUser(); 
    $name = $userNode->getName(); 

    echo $name; 
} 

這似乎直到我離開這個頁面一會兒做工精細,回來刷新這一頁;當我這樣做時,我發現一個This authorization code has expired.異常已被拋出。

我的問題是這樣的:我怎樣才能避免這個問題,並確保通過getLongLivedAccessToken()獲得的訪問令牌真的是最後的"about 60 days"文檔引用?我需要將訪問令牌存儲在會話/ Cookie /數據庫中嗎?

回答

1

你必須檢查用戶是否登錄。如果登錄,所以我們必須在SESSION或(我們可以將其保存在db中)中找到訪問令牌,那麼我們將使用它來訪問facebook圖。

如果用戶未登錄,我們必須生成具有我們想用來訪問數據的權限的訪問鏈接。在我們生成鏈接後,我們將用戶重定向到Facebook以獲取代碼以從中生成訪問令牌。當用戶允許您的應用程序與重定向訪問他的數據的Facebook爲您的網站變量,名爲CODE

 $fb = new Facebook\Facebook([ 
      'app_id' => $APP_ID, 
      'app_secret' => $APP_SECRET, 
      'default_graph_version' => 'v2.5', 
     ]); 

     $helper = $fb->getRedirectLoginHelper(); 

     if(isset($_GET['code']) || isset($_SESSION['fb_token'])){ 
      $accessToken = $helper->getAccessToken(); 
      if (isset($accessToken)) { 
      $_SESSION['fb_token'] = (string) $accessToken; 
      $oAuth2Client = $fb->getOAuth2Client(); 

      $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); 

      $fb->setDefaultAccessToken($longLivedAccessToken); 
      $response = $fb->get('/me'); 
      $userNode = $response->getGraphUser(); 
      $name = $userNode->getName(); 

      echo $name; 
     } 
     } esle{ 
      $_permissions = array(
       'public_profile', 
       'user_friends', 
       'email', 
       'user_about_me'); 
      $canvasLink=callback_url_in_your_app; 

      $helper = $this->_fb->getRedirectLoginHelper(); 
     header('location:'. $helper->getLoginUrl($canvasLink, $permissions); 
    } 
+0

我不知道我理解你的答案。你似乎做了一些有點奇怪的事情,比如檢查是否存在'$ _SESSION ['fb_token']'和'$ _GET ['code']',然後從不讀取它們的值。它也看起來像這個代碼使用'getRedirectLoginHelper'而不是'getJavaScriptHelper'。 (並且有一個小類型 - esle)。 – Phil

+0

對不起,不解釋我的回答,我會爲它添加解釋 –