2011-09-07 79 views
5

我做了一些搜索,但沒有發現與我的問題有關的任何內容。Facebook登錄問題與CSRF狀態令牌不匹配

我目前正在嘗試實施Facebook登錄到我的網站,並且由於htaccess mod重寫URL而導致登錄身份驗證出現問題?

代碼工作完美,我得到登錄,如果我使用它沒有像國防部重寫規則:

domain.com/view_webhosting.php?webhosting=name 

但只要我去到國防部重寫URL

domain.com/webhosting-name/ 

然後它只是沒有工作,並引發錯誤「CSRF狀態令牌不匹配提供的一個。」

在它看起來像這樣

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

任何htaccess的文件

有一個解決這樣的問題?我正在使用Facebook SDK v3.1.1

回答

7

的PHP SDK預計,「狀態」字段是在$ _REQUEST(我相信作爲一個GET參數),然後您可以交換訪問令牌的「代碼」。 From base_facebook.php:

protected function getCode() { 
    if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
     isset($_REQUEST['state']) && 
     $this->state === $_REQUEST['state']) { 

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

    return false; 
} 

您的RewriteRule可能會跺跺那個參數。

2

我假設你是指PHP SDK?

聽起來像你沒有將'狀態'請求變量傳遞給你的PHP腳本。你有沒有讀https://developers.facebook.com/docs/authentication/(特別是比特和保護自己免受CSRF?)。

而且,我認爲這是你的問題一個錯字,但不應該將重寫規則是:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L] 
+0

你好mrtom對不起,這只是一個類型,我想它會更容易閱讀,當我把它翻譯成英文:)我使用的示例是https://github.com/facebook/php-sdk/blob/master/examples/ example.php和CSRF保護沒有任何關係?這個facebook API很奇怪,遍佈各地不同的代碼。但它不能正常工作時,不使用國防部重寫url ... – John

1

試着改變你的重寫規則,以

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA] 

QSA =查詢字符串追加。這可以確保您不會丟失GET參數。

7

謝謝bismark。

你是對的;它無法得到的GET參數,該解決方案是這樣的:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L] 

查詢字符串追加[QSA]

•'qsappend|QSA' (query string append) 
This flag forces the rewrite engine to append a query string part of the substitution string 
to the existing string, instead of replacing it. Use this when you want to add more data 
to the query string via a rewrite rule. 

謝謝你們,把我放在正確的軌道上!

+1

如果bismark是正確的,很高興接受答案或至少投票。我已經投了你的問題,給你一個小小的代表玩。 – Fionnuala

+0

你好Remou,你絕對正確,即時有點新的這個網頁,所以我不知道我可以投票或接受答案:) – John

0

如果有人在.htaccess文件後仍然出現此錯誤,我會建議更改PHP文件中的redirect_uri參數以及Facebook應用設置中的網站URL。

我解決了這個錯誤從

http:domain.com/folder

改變到

http:domain.com/folder/index.php

-1

我由(遺忘)固定這對範圍/權限從應用程序對權限匹配developers.facebook.com/app頁面(即轉到應用程序設置,權限)。

+1

你可能想要更具體一點。 –

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()稱爲從而兩次所得到的和無效的錯誤消息