Restful API - 检查Facebook access token是否有效并授权使用APP

Restful API - Check if Facebook access token is valid and authorized to use APP

我正在构建一个 restful API (PHP) 来服务 iOS 和 Android 应用程序,我想在这两个应用程序上实现 facebook 登录应用程序。

漏洞如下:

为了安全起见,为了避免获得不属于我的应用程序的随机令牌,我想进行测试调用以检查令牌是否已授权和有效?

我知道许多类似的问题可能已经得到解答,但其中 none 确实给了我正确的答案,而我对 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),我不确定这是否是最好的测试方法。

注意:我还处于早期开发阶段,如果您对我的流程有任何建议请告诉我,我可能做错了?

“随机”令牌无论如何都行不通。 (Facebook 发行的令牌是加密的,因此 API 可以判断令牌是否真实,或者只是 "random"。最多你需要担心用户可能会使用令牌进行什么不同的应用程序,或者他们自己授予的权限比您要求的更多。)

只需使用您获得的访问令牌请求用户详细信息 - 如果因为有人试图“伪造”它而无效,那么 API 响应会告诉您。

文档中有一章是关于保护 API 请求的,你也可以去看看:https://developers.facebook.com/docs/graph-api/securing-requests

什么适用于我的应用程序(下面有解释的代码)...

$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 语句,以便将用户重定向到一个页面,他们可以在该页面重新验证他们的 account/access 令牌,具体取决于您的应用正在做什么。

我的应用程序使用几个 WHILE 循环来遍历我的用户数据库,并根据某些 column/cell 值,它会为他们发布到他们的 Facebook 页面...

在此解决方案之前...当循环遇到无效的访问令牌时,它 "broke" 并且没有为 "unauthenticated user" 之后的行执行脚本,因为它正在发出失败的请求.

希望这对某人有所帮助!