$ facebook-> getUser();仍然返回0

问题描述:

我看到这已经被问了很多这里,但我还没有拿出一个解决方案。我需要获取用户的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。我猜这是因为我是我的页面的管理员。

有人知道问题在这里吗?

我也有这个问题,唯一的解决办法是使用oauth之前与许可请求 “user_about_me”。由于FB使用OAuth 2.0,用户最值是隐藏的,您有权要求 这一切的sh * T :(

我的猜测是,大部分与$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攻击。