2012-11-04 90 views
0

我想建立一個Facebook用戶登錄使用PHP。我能夠獲取用戶信息,但每次登錄都會在登錄成功後在我的服務器CSRF state token does not match one provided.上創建錯誤日誌。Facebook的登錄CSRF

我發現很多關於谷歌創建Facebook登錄的教程。我還發現了同樣的問題的幾個其他職位。他們似乎責怪不止一次地調用getLoginUrl(),我不這樣做。而且因爲我使用的是sdk自帶的例子,所以我很困惑它爲什麼會被打破。

<?php 
    require 'facebook.php'; 

    $facebook = new Facebook(array(
     'appId' => 'APP_ID', 
     'secret' => 'APP_SECRET', 
    )); 

    $user = $facebook->getUser(); 

    if ($user) { 
     try { 
      $user_profile = $facebook->api('/me'); 

      $logoutUrl = $facebook->getLogoutUrl(); 
      echo "<a href=" . $logoutUrl . ">Logout</a><br><br>"; 
      print_r($user_profile); 

     } 
     catch (FacebookApiException $e) { 
      error_log($e); 
      $user = null; 
     } 
    } 
    else { 
     $loginUrl = $facebook->getLoginUrl(); 
     echo "<a href=" . $loginUrl . ">Login</a>"; 
    } 
?> 
+0

有您在Facebook開發者網站的應用設置中允許您的網址? –

+0

是的,我有。任何地方我都可以找到將我輸入域名的URL。 –

回答

0

在相同的處理程序中檢查兩次令牌時,Facebook SDK代碼有一個錯誤。

我編輯的facebook.php的引用代碼函數是這樣的:

protected function getCode() { 
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) { 
     return false; 
    } 
    if ($this->state === $_REQUEST['state']) { 
     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } 
    self::errorLog('CSRF state token does not match one provided.'); 

    return false; 
} 

更清晰,如果調用兩次沒有規定無效令牌。

要明確功能可以在同一個URL處理程序被調用兩次,如果如:

$facebook->getUser();,然後在相同的處理$facebook->getLogoutUrl()那麼getCode()被稱爲因此兩次導致進入和無效的錯誤消息