2014-08-29 46 views
1

我正在使用SDK v.4,但類FacebookRedirectLoginHelper方法isValidRedirect出現問題。Facebook isValidRedirect總是返回false

的SDK的代碼是

protected function isValidRedirect() 
    { 
    return $this->getCode() && isset($_GET['state']) 
     && $_GET['state'] == $this->state; 
    } 

雖然$_GET['state']是在回調URL的參數和$this->state由它產生的密碼安全pseudrandom號碼的功能random()分配。

$ _GET ['state']和$ this-> state;永遠不會回報真實!

應該檢查$ _SESSION不是$ _GET

回答

1

其實,如果你在代碼仔細一看,該loadState()功能實際上看起來在$_SESSION並將其裝入$this->state狀態。之後調用isValidRedirect(),這意味着它使用$_SESSION加載state

您也可以在Facebook上登錄後看到$_GET['state']存在於URL中,因此此檢查有效。如果不是,代碼將永遠不會交換爲access_token

+0

請問你能解釋一下你的答案嗎?如何避免以上情況發生?即$ _GET ['state']&$ this->狀態不匹配。 – 2015-03-10 09:52:32

+0

當facebook返回到我的網址時,它再次調用getLoginUrl()函數。 所以我的問題是,是否有條件像if($ _ SESSION ['FBRLH_state'] ==''),然後只調用函數getLoginUrl()? – 2015-03-10 12:01:39

+1

'getLoginUrl()'函數不會進行API調用,因此它在代碼中再次被調用應該沒有關係。更好的做法是尋找'$ _GET ['code']',因爲這將是Facebook在登錄時返回的內容。看看我的例子:https://www.webniraj。com/2014/05/01/facebook-api-php-sdk-updated-to-v4-0-0/ – 2015-03-11 11:53:06

0

我也有類似的問題,我只是修復它。

重點是關於'狀態'變量。

getLoginUrl()會產生一個新的'狀態',所以我只在第一階段叫getLoginUrl()

階段1: 我顯示了一個頁面,鏈接由getLoginUrl()生成。 在這裏我得到了一個狀態,說的值是X.

第2階段: 用戶點擊鏈接,然後被重定向到Facebook的誓言對話框,用戶在其中鍵入將在自己的Facebook名稱和密碼,並允許應用訪問用戶的公開信息。

第3階段: 用戶被重定向回我的網站,以「國家」,和值爲X.

如果我叫getLoginUrl()在這裏,一個新的「國家」,將會產生 因此isValidRedirect()將始終返回false。

所以我檢查isset($_GET['state'])第一, 不叫getLoginUrl()isset($_GET['state'])TRUE

我希望這會有所幫助。

+0

我知道這是這種情況,並編寫我的應用程序來避免這個問題,但我仍然得到它。我已經爲storeState函數添加了一個var_dump,這樣我就可以知道它何時更新會話值。它會運行一次以按預期生成url,並且當我從Facebook返回時它不會運行一次,但會話值和獲取值由於某種原因而不匹配。我已經花了數小時的時間在這方面,我看不到這是怎麼回事。 – 2014-11-14 00:24:27