6

我正在使用Facebook的PHP和js sdk。Facebook PHP/JS Sdk此授權碼已被使用錯誤

我使用js sdk登錄facebook。登錄完美。

我有php部分。

private $helper, $api_id, $app_secret, $session;   

.... 

FacebookSession::setDefaultApplication($this->api_id, $this->app_secret); 
$this->helper = new FacebookJavaScriptLoginHelper(); 


try { 
    $this->session = $this->helper->getSession(); 
} catch (FacebookRequestException $ex) { 
    log_message('error', 'Facebook e1 :' . $ex->getCode()); 
    log_message('error', 'Facebook e1 :' . $ex->getMessage()); 
} catch (\Exception $ex) { 
    log_message('error', 'Facebook e2 :' . $ex->getCode()); 
    log_message('error', 'Facebook e2 :' . $ex->getMessage()); 
} 

if ($this->session) { 
    $request = (new FacebookRequest($this->session, 'GET', '/me'))->execute(); 
    $user = $request->getGraphObject()->asArray(); 
    return $user; 
} else { 
    return false; 
} 

當頁面正常加載時,我得到的用戶數據沒有問題。

但是,例如,如果我按f5幾次,刷新頁面,我得到和錯誤,「此授權碼已被使用。」或「此授權碼已過期。」用戶數據爲空。

想法是用js登錄,並使用php部分來驗證是用戶登錄到Facebook或不。

我使用最新的Facebook SDK PHP:https://github.com/facebook/facebook-php-sdk-v4

謝謝。

+0

這也發生在我身上。 :/ – Chuy 2014-09-29 21:26:26

+0

發生在我身上:( – ilumin 2014-10-27 09:58:51

回答

3

有幾種方法可以解決這個問題。

1)您必須在每次調用時更新Cookie中的訪問令牌,FB不會自動執行此操作。所以,請確保您撥打FB.initstatus: true param。

FB.init({ 
     appId  : window.fbId, 
     cookie  : true, 
     status  : true, 
     version : 'v2.3' 
    }); 

接下來,無論您是否已經連接到Facebook,每頁刷新都必須撥打FB.getLoginStatus();

如果您的應用程序需要執行一些ajax調用,這僅僅是因爲您在執行ajax時未更新訪問令牌(除非您在每次調用ajax之前調用FB.getLoginStatus();-這已經過時了)。

2)一旦用戶通過FB JS SDK連接,更好的做法是在會話中存儲訪問令牌。 PHP代碼可能如下所示:

try { 
     $fbToken = isset($_SESSION['fbToken']) ? $_SESSION['fbToken'] : NULL; 
     if ($fbToken !== NULL) { 
      $session = new \Facebook\FacebookSession($fbToken); 
     } else { 
      $helper = new FacebookJavaScriptLoginHelper(); 
      $session = $helper->getSession(); 
     } 

    } catch(\Facebook\FacebookRequestException $ex) { 
     log_message('error', 'Facebook e1 :' . $ex->getCode()); 
     log_message('error', 'Facebook e1 :' . $ex->getMessage()); 
    } catch(\Exception $ex) { 
     log_message('error', 'Facebook e2 :' . $ex->getCode()); 
     log_message('error', 'Facebook e2 :' . $ex->getMessage()); 
    } 

    if ($session) { 
     $accessToken = $session->getAccessToken(); 
     $longLivedAccessToken = $accessToken->extend(); 
     $_SESSION['fbToken'] = $longLivedAccessToken; 
     $request = (new FacebookRequest($session, 'GET', '/me'))->execute(); 
     $user = $request->getGraphObject()->asArray(); 
     return $user; 
    } else { 
     return FALSE; 
    } 
} 

希望我確實幫了忙...... 乾杯。

-1

刪除瀏覽器歷史記錄,cookies這是因爲你測試你的面前,然後會產生一些不良值

+0

嗯我試過另一個帳戶和其他瀏覽器所有作品 – 2016-11-02 18:17:59

相關問題