我看到这里有很多问题,但我还没有提出解决方案。我需要获取用户的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。我猜这是因为我是我的页面的管理员。
有人知道这里的问题是什么吗?
答案 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 :(