【问题标题】:Restful API - Check if Facebook access token is valid and authorized to use APPRestful API - 检查 Facebook 访问令牌是否有效并被授权使用 APP
【发布时间】:2016-11-09 14:20:04
【问题描述】:

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

缺陷如下:

  • 客户端(ios 或 Android)使用 facebook 登录并将 access_token 发送到 restful api
  • 验证 access_token 是否被授权使用应用程序
  • 如果令牌有效,则从图表中获取用户数据。
  • 合并帐户并为不同的查询生成令牌。

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

我知道可能已经回答了许多类似的问题,但没有一个能真正给我正确的答案,而且我也没有使用 facebook graph 的经验。

我找到了这个解决方案:

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),我不确定这是否是最好的测试方法。

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

【问题讨论】:

  • “随机”令牌无论如何都不起作用。只需使用您获得的访问令牌请求用户详细信息 - 如果它因为有人试图“伪造”它而无效,那么 API 响应会告诉您。 // 文档中有一章是关于保护 API 请求的,你也可以去看看:developers.facebook.com/docs/graph-api/securing-requests
  • 太棒了!现在我为我的服务器调用添加了一个 appsecret_proof,它运行良好我认为随机令牌不能再工作了:D 你可以添加你的评论作为答案,以便我可以接受吗?谢谢:)

标签: php facebook rest facebook-graph-api restful-authentication


【解决方案1】:

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

$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 页面...

在此解决方案之前...当循环遇到无效的访问令牌时,它“中断”并且没有为“未经身份验证的用户”之后的行执行脚本,因为它发出了失败的请求。

希望这对某人有所帮助!

【讨论】:

    【解决方案2】:

    “随机”令牌无论如何都不起作用。 (Facebook 发行的令牌是加密的,因此 API 可以判断令牌是真实的,还是只是“随机的”。您最多需要担心用户可能会将令牌用于不同的应用程序,或者他们他们授予的权限比您要求的要多。)

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2011-04-20
      • 2019-11-09
      • 2012-03-03
      • 2022-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多