2012-02-02 76 views
3

我在php的中級水平和新的facebook開發。我已經瀏覽了Facebook文檔和Stack Overflow先前的評論。擴展訪問令牌到期不起作用

我基本上想要做的就是讓用戶使用他們的Facebook帳戶登錄並顯示他們的名字。

我的php頁面有一個圖形,頁面自動刷新每2或5分鐘。

我驗證並獲取Facebook first_name放在頁面上。

$graph = $facebook->api('/me'); 

回聲$圖[「FIRST_NAME」]來獲取用戶。(對此我認爲是不需要的訪問令牌)的名字。

大約90分鐘後。我已經接收到錯誤:

fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user...... 

,我沒有值(0),在$ facebook->的getUser();參數

我知道,離線訪問權限已經貶值,(我也有這個在我的應用程序啓用高級設置)

我試圖得到一個擴展的訪問令牌。在FB文檔中。我看到:

https://graph.facebook.com/oauth/access_token?     
    client_id=APP_ID&  
    client_secret=APP_SECRET&  
    grant_type=fb_exchange_token&  
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

我包括我的鏈接信息(現有的有效的訪問令牌和所有),並收到了訪問令牌:

access_token=AAADbZBPuUyWwBAFubPaK9E6CnNsPfNYBjQ9OZC63ZBN2Ml9TCu9BYz89frzUF2EnLttuZAcG2fWZAHbWozrvop9bQjQclxVYle7igvoZCYUAg2KNQLMgNP&expires=4050 

然而,此令牌在約1小時左右到期。 (.... expires = 4050)

我假設我使用服務器端身份驗證,因爲我使用PHP?

回答

7

我假設您需要在您的Apps高級設置頁面中啓用「deprecate offline_access」。由於這個工作對我來說:

 

//added code in base_facebook.php inside the facebook class 
public function getExtendedAccessToken(){ 

    try { 
     // need to circumvent json_decode by calling _oauthRequest 
      // directly, since response isn't JSON format. 
     $access_token_response = 
      $this->_oauthRequest(
       $this->getUrl('graph', '/oauth/access_token'), 
       $params = array( 'client_id' => $this->getAppId(), 
            'client_secret' => $this->getAppSecret(), 
            'grant_type'=>'fb_exchange_token', 
            'fb_exchange_token'=>$this->getAccessToken(), 
          )); 

    } catch (FacebookApiException $e) { 
     // most likely that user very recently revoked authorization. 
     // In any event, we don't have an access token, so say so. 
     return false; 
    } 

    if (empty($access_token_response)) { 
     return false; 
    } 

    $response_params = array(); 
    parse_str($access_token_response, $response_params); 
    if (!isset($response_params['access_token'])) { 
     return false; 
    } 

    return $response_params['access_token']; 
} 
 

令牌仍然可能無效的幾個原因,見How-To: Handle expired access tokens。 希望它可以幫助

+0

謝謝!我會試試這個。是的,我確實啓用了「deprecate offline_access(我在我的問題中陳述了這一點......我沒有人認爲我沒有做任何研究!!) – 2012-02-02 05:54:37

+0

你好,我試過上面的代碼將它放在base_facebook的適當位置.php。然而,當我訪問url時,使用我在登錄時獲得的訪問令牌,我看到一個訪問令牌即將過期(當我刷新時,access_token部分中的秒數會減少)。訪問令牌(當我沒有登錄時...我得到一個HTTP 400錯誤)。有什麼我可以嘗試?請給出詳細信息!謝謝! – 2012-02-02 08:26:08