2011-11-15 102 views
2

我看到這已經被問了很多這裏,但我還沒有拿出一個解決方案。我需要獲取用戶的ID以確定他們是否已經在我的應用中填寫了表單。這是我的代碼..

require_once('facebook.php'); 
$facebook = new Facebook(array( 
'appId' => 'xxxxxxxxxx', 
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx', 
'cookie' => false, 
)); 

$signed_request = $facebook->getSignedRequest(); 
$page_id = "fb" . $signed_request['page']['id']; 
$user_id = $facebook->getUser(); 

我不知道這是否相關,但我可以抓住頁面編號就好了。但$user_id對於除我以外的所有用戶始終返回0。我猜這是因爲我是我的頁面的管理員。

有人知道問題在這裏嗎?

回答

0

我也有這個問題,唯一的解決辦法是使用oauth之前與許可請求 「user_about_me」。由於FB使用OAuth 2.0,用戶最值是隱藏的,您有權要求 這一切的sh * T :(

2

我的猜測是,大部分與$facebook->getUser()所報告的問題都涉及到內置於Facebook的PHP CSRF (Cross Site Request Forgery)保護SDK和實施起來有些不太合適

CSRF保護所做的是確保獲取用戶數據的請求需要來自同一臺服務器,它通過在會話中存儲隨機散列來實現。 getUser()沒有這個值設置,getUser()將總是返回0.

所以用戶需要先訪問你的站點,一個CS RF令牌將被生成並存儲在會話和僅在以下請求可以成功調用的getUser()

如果你看看PHP SDK源代碼,你會注意到的方式來產生這CSRF令牌是調用一個名爲establishCSRFTokenState()的受保護方法。調用$facebook->getLoginUrl(...)

的時候,所以你不能從外部調用該方法,它被調用的唯一方法是,可以修改SDK源來改變這種行爲(或使establishCSRFTokenState()公用)或只需調用getLoginUrl(...)當用戶第一次訪問您的網站。確保您已啓用會話支持。

我認爲這不是很好設計,記錄更糟。在大多數情況下,除非人們瞭解如何正確使用它,否則無法保護網站免受CSRF攻擊。