验证Facebook API访问令牌&用户ID通过PHP SDK?

时间:2014-06-05 19:41:53

标签: php ios facebook facebook-graph-api cordova

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

我已经很好地设置了所有内容,应用程序显示了Facebook访问令牌和身份验证用户的“userID”。问题是,Facebook令牌只持续约2个月。为了解决这个问题,我创建了一个表,其中包含了Facebook为所有基于FB的用户提供的每个FB访问令牌。这适用于我的网站“使用Facebook登录”按钮!

...但是因为这个Phonegap插件让设备成为Facebook和我的数据库之间的中间人,我需要我的服务器直接用Facebook仔细检查以验证用户提供的用户ID和访问令牌是否真实。我已经看到我可以查询https://graph.facebook.com/app?access_token=TOKEN或执行类似的操作:

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

......并且显然得到了我需要的一切,但我感觉攻击者可以继续点击我的PHP脚本,一遍又一遍地检查Facebook,直到他们找到成功 - 然后他们将拥有访问所需的凭据我的应用代表那个用户猜对象的用户。

如果攻击者在几周内猜测任何Facebook访问令牌的想法是荒谬的,请告诉我。但我希望将其缩小范围并迫使攻击者也知道他们猜测哪个用户访问令牌 - 这几乎不可能破解。那么如何验证用户使用用户访问令牌&用户的数字ID?

2 个答案:

答案 0 :(得分:5)

只要您获得令牌,就可以从Facebook获取用户的Facebook ID,并使用Facebook的用户ID来查找您的用户。

即使您的应用需要离线访问并且您使用已保存的令牌,请在使用之前验证令牌。

如果您未验证令牌,则如果用户退出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
}

答案 1 :(得分:2)

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

假设访问令牌泄露给犯罪分子: 如果您建议与用户的FB数字ID进行比较 - 不要!可以使用访问令牌访问id。相反,当用户第一次注册时,会为用户分配您自己的唯一ID /用户名。