【问题标题】:Facebook: How to get app id from user's access token - using /app?access_token=TOKEN?Facebook:如何从用户的访问令牌中获取应用程序 ID - 使用 /app?access_token=TOKEN?
【发布时间】:2012-08-10 12:50:07
【问题描述】:

我们允许用户仅使用 facebook 访问令牌作为凭据来访问我们的后端(使用 REST api over https 和 json 回复),因此我们想做两件事:

  1. 验证访问令牌并找到用户的 id - 这只是对https://graph.facebook.com/me?access_token=TOKEN的调用

  2. 确保此访问令牌属于我们的 facebook 应用程序。 你可以打电话 https://graph.facebook.com/app?access_token=TOKEN,但这似乎是一个未记录的功能(而且有时相当慢)。

谁能告诉我这实际上是否是一种可能会保留在那里的标准方法?或者是否有另一种方法来做我们想做的事情:验证用户的访问令牌是否有效并且来自我们的 Facebook 应用程序。

你可以打电话给我/permissions 和 me?fields=installed,但这些似乎都不能告诉我我们正在检查哪个 facebook 应用程序。

【问题讨论】:

  • 上面有一个similar question。我认为您真的不需要验证访问令牌是否属于您的特定应用程序。您只需将它与您的应用程序一起使用,如果它不属于它,您会收到错误。
  • @Lego,谢谢。但问题是我没有收到错误 - 我们的后端只是使用访问令牌调用 FB Graph API,只要它有效,我们就可以获得 /me 资源 - 它可能是来自其他 Facebook 应用程序的访问令牌,对吗?
  • 我不明白的是为什么你应该关心访问令牌是否属于你的应用程序,只要你从令牌中获取用户数据。也许我只是没有看到全貌。
  • 这样其他人就无法设置 facebook 应用程序,让人们添加它,获取他们的访问令牌,并使用它们代表用户与我们的后端对话。我不确定他们为什么要这样做,但仍然可能是滥用行为。

标签: facebook facebook-graph-api oauth-2.0


【解决方案1】:

您应该按照docs(客户端或服务器端)中的说明实施身份验证流程。基本上,您通过使用您的应用程序对用户进行身份验证来获得一个新的访问令牌,并将该令牌用于对您的服务器的请求。通过这种方式,您可以确定令牌“属于”您的应用程序。步骤:

  1. 使用您的应用 ID 初始化您选择的 Facebook SDK。
  2. 检查用户是否已授权您的应用。
  3. 如果用户已经授权您的应用,您将获得他或她的 Facebook 用户 ID 以及令牌(“属于”您的应用),如果没有:验证用户并获得令牌。

docs 为您提供示例代码和大量详细信息:

更新:

您提到的功能已记录在 here(向下滚动到 2. 向 API 发出请求):

应用访问令牌允许您作为应用发出请求,而不是 一个用户。要检索应用程序的详细信息,请执行 HTTP 获取:
https://graph.facebook.com/app?access_token=APP_ACCESS_TOKEN

因此该功能可能会保留。

【讨论】:

  • 对...我们的问题是我们计划在前端/移动应用程序中挖掘出一个访问令牌,然后将其传递给后端,让后端使用 facebook 验证访问令牌。但有效的访问令牌本身并不意味着对我们后端的调用来自受信任方。
  • 如何定义可信方?如果您有一个有效的访问令牌,那么您就有一个有效的用户,即使该用户没有对您的应用进行身份验证或授权。
  • 这正是我的观点。如果您设置了“免费啤酒优惠券”Facebook 应用程序并秘密使用您用户的访问令牌在我们的后端做事,那么您就不是我所说的受信任方……而是我们自己的网络前端或移动应用程序或任何被“信任”的东西。这就是为什么我认为检查(在后端)哪个 facebook 应用程序用于获取访问令牌会很整洁。
  • 那么你如何获得你朋友的访问令牌呢?试试看!如果您不知道朋友的登录名和密码,那将非常困难。好吧,你可以问他……
  • 黑客亨利可以通过设置一个看起来像游戏或其他东西的Facebook应用程序来获取无辜的欧文的访问令牌。 Irving 注册了该应用程序,突然间,Henry 拥有了 Irving 的访问令牌。然后亨利可以使用该访问令牌登录我们的后端,假装是欧文。
【解决方案2】:

这是旧的,但我最近也有同样的担忧。我认为最直接的方法是使用debug_token 检查访问令牌。

GET graph.facebook.com/debug_token?
 input_token={token-to-inspect}
 &access_token={app-token-or-admin-token}

参考:https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#checktoken

【讨论】:

    【解决方案3】:

    您可以在每个请求中传递signed_request insted of access_token。 参数 signed_request 基于您的应用程序的密钥,您可以简单地验证它。阅读documentation 了解签名请求。

    【讨论】:

    • 如果您在 JS SDK 之外使用FB.login,您得到的响应确实包含signed_request 属性。将其发布到您的服务器,在那里进行验证......此时可以想象的最高安全级别达到了恕我直言。
    • 这对我来说是个好主意。我需要检查移动应用程序开发人员是否也可以获得signed_request,但我接受了这个答案。
    • 但是signed_request 不是用于相反的吗?即验证来自 Facebook 的信息是否合法?
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2012-08-13
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2011-12-29
    • 2016-01-18
    相关资源
    最近更新 更多