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(); 

我不知道这是否相关,但我可以很好地获取页面 ID。但$user_id对于除我之外的所有用户,始终返回为 0。我猜那是因为我是我页面的管理员。

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

4

2 回答 2

2

我的猜测是,大多数报告的问题$facebook->getUser()都与Facebook 的 PHP SDK 中内置的CSRF(跨站点请求伪造)保护有关,并且实施起来有些笨拙。

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

所以用户需要首先访问您的站点,一个 CSRF 令牌将被生成并存储在会话中,并且只有以下请求中您才能成功调用 getUser()

如果您查看 PHP SDK 源代码,您会注意到生成此 CSRF 令牌的方法是调用一个名为establishCSRFTokenState(). 您不能从外部调用此方法,调用它的唯一方法是在调用时$facebook->getLoginUrl(...)

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

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

于 2011-11-16T20:09:02.947 回答
0

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

于 2011-11-16T11:01:08.450 回答