$ facebook->的getUser(); STILL返回0

时间:2011-11-15 22:14:46

标签: facebook userid

我看到这里有很多问题,但我还没有提出解决方案。我需要获取用户的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(); 

我不知道这是否相关但我可以抓住页面ID就好了。但$user_id对于除我之外的所有用户都保持为0。我猜这是因为我是我的页面的管理员。

有人知道这里的问题是什么吗?

2 个答案:

答案 0 :(得分:2)

我的猜测是,$facebook->getUser()报告的大多数问题都与Facebook的PHP SDK中内置的CSRF (Cross Site Request Forgery)保护有关,并且实施起来有点笨拙。

CSRF保护的作用是确保获取用户数据的请求需要来自同一服务器。它通过在会话中存储随机哈希来实现。如果在没有设置此值的情况下调用getUser(),则getUser()将始终返回0.

因此,用户需要首先访问您的网站,生成CSRF令牌并将其存储在会话中 以下请求您可以成功调用getUser( )

如果查看PHP SDK源代码,您会注意到生成此CSRF令牌的方法是调用名为establishCSRFTokenState()的受保护方法。您不能从外部调用此方法,并且调用$facebook->getLoginUrl(...)

时调用此方法的唯一方法

因此,要么修改SDK源代码以更改此行为(或将establishCSRFTokenState()公开),要么在用户首次访问您的网站时调用getLoginUrl(...)。确保您已启用会话支持。

我认为这个设计得不是很好,记录得更糟。除非人们了解如何正确使用它,否则在大多数情况下保护网站免受CSRF攻击都无济于事。

答案 1 :(得分:0)

我也有这个问题,唯一的解决方案是在使用权限请求之前使用oauth “user_about_me”。由于FB使用oauth 2.0,因此大多数用户值都是隐藏的,您必须请求 所有这些sh * t :(