我正在构建一个RESTful API(PHP)来为iOS和Android应用程序提供服务,我想在两个应用程序上实现facebook登录。
缺陷如下:
出于安全目的,为了避免获得他们不属于我的APP的随机令牌,我想打个电话来检查令牌是否经过授权和有效?
我知道许多类似的问题可能已经得到解答,但没有一个能给我正确答案,而且我也没有真正的facebook图表经验。
我找到了这个解决方案:
https://graph.facebook.com/oauth/access_token?client_id=APP_ID&client_secret=SECRET_APP_ID&grant_type=fb_exchange_token&fb_exchange_token=ACCESS_TOKEN
这有点工作..它是给我一个错误,还是一个访问令牌(字符串格式不是JSON),我不确定这是否是测试的最佳方式。
注意:我还处于开发的早期阶段,如果您对我的流程有任何建议请告诉我,我可能做错了吗?
答案 0 :(得分:3)
什么适用于我的应用程序(代码及以下说明)......
$fb = new Facebook\Facebook([
'app_id' => 'XXXXXXX',
'app_secret' => 'XXXXXXX',
'default_graph_version' => 'v2.5',
]);
// My app pulls users' access tokens & page ID from a database here and stores in $fb_access_token & $fb_page_id variables
$fb_access_token = 'YOU OR YOUR USERS ACCESS TOKEN GOES HERE';
$fb_page_id = 'ID OF FACEBOOK PAGE OR USER';
$fb->setDefaultAccessToken($fb_access_token);
// CHECK IF ACCESS TOKEN SITLL WORKS
try{
$page = $fb->get('/'.$fb_page_id.'?fields=id', $fb_access_token);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
$graphError = 'Yes';
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
$sdkError = 'Yes';
}
// IF ACCESS TOKEN STILL WORKS...CONTINUE WITH SCRIPT. THIS PREVENTS ACCESS TOKEN FAILURE FROM BREAKING SCRIPT.
if(!isset($graphError) && !isset($sdkError)){
// CONTINUE WITH SCRIPT
}
说明:您正在获取有问题的访问令牌,并尝试向Facebook API发出GET请求。如果没有错误,只能继续使用其余的脚本。
您还可以在最后添加ELSE语句,以便将用户重定向到可以重新验证其帐户/访问令牌的页面,具体取决于您的应用正在执行的操作。
我的应用程序使用几个WHILE循环来浏览我的用户数据库,并且根据某些列/单元格值,它会为他们的Facebook页面发送信息......
在此解决方案之前......当Loop遇到无效的访问令牌时,它“破坏”并且没有执行“未经身份验证的用户”之后的行的脚本,因为它正在发出失败的请求。
希望这有助于某人!
答案 1 :(得分:1)
“随机”令牌无论如何都不会起作用。 (由Facebook发行的令牌是加密的,因此API可以判断令牌是真的还是“随机”。最多你需要担心用户可能使用令牌为不同的应用程序,或者他们一个他们自己获得了比你要求的更多的权限。)
只需使用您获得的访问令牌请求用户详细信息 - 如果由于有人试图“伪造”它而无效,那么API响应会告诉您。
文档有一章关于保护API请求,也请检查一下:https://developers.facebook.com/docs/graph-api/securing-requests