通过PHP SDKvalidationFacebook API访问令牌和用户ID?

我在我的服务器上使用了Facebook PHP SDK(v3.2.3,而不是v4.0)( https://developers.facebook.com/docs/reference/php/3.2.3 ),而Phonegap Facebook Plugin(Master )( https://github.com/phonegap/phonegap-facebook-plugin )手动安装在我的Phonegap v3.3.0 iOS应用程序。

我已经设置了一切,应用程序显示Facebook访问令牌和身份validation用户的“用户ID”。 问题是,Facebook代币只能使用大约2个月。 为了解决这个问题,我创build了一个表格,其中包含Facebook为所有基于FB的用户提供的每个FB Access Token。 这与我的网站的“使用Facebooklogin”button很好用!

…但是,因为这个PhoneGap插件离开设备作为Facebook和我的数据库之间的中间人,我需要我的服务器直接与Facebook进行仔细检查,以validation用户提供的用户ID和访问令牌是真实的。 我已经看到,我可以查询https://graph.facebook.com/app?access_token=TOKEN或做类似的事情:

 GET /debug_token? input_token={input-token}& access_token={access-token} 

…显然我找回了所需要的东西,但是我感觉攻击者可以继续打我的PHP脚本,一遍又一遍地检查Facebook,直到他们find成功 – 然后他们将有必要的凭据访问我的应用程序代表他们所猜测的令牌的用户。

如果攻击者在几周内猜测任何Facebook访问令牌的想法是荒谬的,请告诉我。 但是我希望能够缩小它的范围,并且迫使攻击者也知道他们在猜测哪个用户的访问令牌 – 这几乎不可能被破解。 那么我怎样才能使用用户访问令牌和用户的数字ID来validation用户呢?

无论何时获取令牌,都可以从Facebook获取用户的Facebook ID,并使用Facebook上的用户ID来查找您的用户。

即使您的应用需要离线访问,并使用已保存的令牌,请在使用该令牌之前对其进行validation。

如果您不validation令牌,那么如果用户从Facebook注销或未经授权的应用程序,您的应用程序可能仍然有效。

 $facebook = new Facebook(array( 'appId' => <FACEBOOK_ID>, 'secret' => <FACEBOOK_SECRET>, )); $facebook->setAccessToken($_REQUEST['access_token']); if (($userId = $facebook->getUser())) { // $_REQUEST['access_token'] is valid token for user with id $userId } 

您不应该担心攻击者猜测访问令牌。 访问令牌长度为211个字符,包含大约62种字符(基于我的令牌)。 这是62 ^ 211独特的访问令牌。 世界上只有70亿人,所以实际上不可能强行使用一个访问令牌。 不过这种攻击是FB的责任,可以产生更好的access_token。

假设访问令牌泄露给犯罪分子:如果您build议与用户的FB数字ID比较 – 不要! 该ID可以通过访问令牌访问。 相反,当他们第一次注册或者某个东西的时候,给用户分配你自己的唯一的ID /用户名。