【问题标题】:Verify Facebook Access Token for specific App验证特定应用的 Facebook 访问令牌
【发布时间】:2013-01-10 17:16:46
【问题描述】:

我需要验证我的 iPhone 应用上的用户是否确实登录了我的 Facebook 应用。我可以通过使用他们的访问令牌检索它来验证他们的用户 ID:

https://graph.facebook.com/me?fields=id&access_token=XXXXXXXXXXXXXXX

我预见到的安全问题是,他们可以向我发送任何有效的访问令牌,并且它将返回他们的用户 ID。我还需要验证此令牌是否适用于我的特定应用程序。有没有办法在此请求中返回应用程序 ID 以进行验证?

【问题讨论】:

  • 我很困惑。为什么要使用外部令牌?更重要的是,您如何要求用户将其提供给您?传递令牌是一个安全问题 - 如果有人拿到它,他们可以冒充用户和您的应用程序。您应该使用 FB iOS SDK 来要求用户从您的应用程序内部登录 Facebook。
  • 我是。他们在我的 iPhone 应用程序上登录我的 Facebook 应用程序。问题是必须通过我的 API 在服务器上完成/验证某些操作。由于 facebook 是我的应用程序的身份验证/身份管理系统,当他们对我的服务器进行某些 API 调用时,我需要验证用户是他们所说的那个人。他们传递他们的用户 ID 和访问令牌,我在服务器上验证它。
  • 我明白了。这是一个有趣的场景。你介意给我发一封简短的电子邮件给 fb.com 的 francip 吗?我想确保 SDK 人员正在考虑客户端和服务器应用程序之间的身份传输。

标签: facebook api authentication


【解决方案1】:

您可以在您的 api 调用中使用appsecret_proof

来自official documentation

访问令牌是可移植的。可以获取访问令牌 由 Facebook 的 SDK 在客户端生成,发送到服务器,然后 代表客户端从该服务器进行调用。

您可以通过将 appsecret_proof 参数添加到每个 来自服务器的 API 调用并启用设置以要求证明 所有通话。这可以防止坏人使用您的 API 调用 从他们的服务器访问令牌。

例子:

https://graph.facebook.com/app?access_token=TOKEN&appsecret_proof=<app secret proof>

在 PHP 中:

$endpoint = sprintf(
    'https://graph.facebook.com/app?access_token=%s&appsecret_proof=%s',
    urlencode($accessToken),
    urlencode(
        hash_hmac('sha256', $accessToken, $appSecret)
    )
);

您现在可以相信您获得的响应可用于身份验证。

【讨论】:

    【解决方案2】:

    Facebook 现在支持调试访问令牌。您可以通过向debug_token 连接发出GET 请求来检索与特定访问令牌相关的信息。比如:

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

    在哪里, input-token:您想要获取相关信息的访问令牌和 access-token:您的应用访问令牌或来自的有效用户访问令牌 应用开发者

    这将返回以下信息:

    {
            "data": {
                "app_id": 000000000000000, 
                "application": "Social Cafe", 
                "expires_at": 1352419328, 
                "is_valid": true, 
                "issued_at": 1347235328, 
                "scopes": [
                    "email", 
                    "publish_actions"
                ], 
                "user_id": 1207059
            }
        }
    

    您可以在Getting Info about Tokens and Debugging 参考中获得有关它的更多信息。

    【讨论】:

    • 什么是“input_token”?
    • @SeanThompson:这是您想要获取相关信息的访问令牌。我也更新了参考资料。
    • 好吧,我很困惑。所以 input_token 基本上是您要验证的用户令牌,而 access_token 是您的应用程序令牌?我把术语弄混了。所以我猜我必须在某个地方保存对我的应用令牌的引用
    • 警告:这已更改,因此只能使用发给开发者帐户的令牌。
    • 谢谢!我已经根据新文档更新了答案。
    【解决方案3】:

    这是我在 Python 3 中的实现,实现了单个 Facebook 批处理请求。 这应该可以让您在一次调用中同时获得与用户的 access_token 相关联的 APP 和 USER 数据。

    #Build the batch, and urlencode it
    batchRequest = '[{"method":"GET","relative_url":"me"}, {"method":"GET","relative_url":"app"}]'
    batchRequestEncoded = urllib.parse.quote_plus(batchRequest)
    
    #Prepare the batch and access_token params
    dataParams = 'access_token=%s&batch=%s' % (fb_access_token, batchRequestEncoded)
    dataParamsEncoded = dataParams.encode()
    fbURL = 'https://graph.facebook.com/'
    
    #This will POST the request
    response = urllib.request.urlopen(fbURL, dataParamsEncoded)
    
    #Get the results
    data = response.read()
    data = json.loads(data.decode("utf-8"))
    

    可能有一种更 Python 的方式来实现我编写的一些编码调用,但我只是想展示什么对我真正有用。

    【讨论】:

    • 非常感谢!不是最好的 Pythonic 方式,但效果很好
    【解决方案4】:

    是的。你可以这样查询:

    https://graph.facebook.com/app?access_token=TOKEN
    

    它将返回有关创建访问令牌的应用程序的名称、ID 和一些统计信息。

    【讨论】:

    • 所以要检查用户的访问令牌是否属于我的应用,我需要向 Facebook 发出两个 API 请求?
    • 不一定。您可以在一个 API 请求中使用 batch request
    • 您也可以在userapplication 表上使用FQL multiquery。您可以在一个简单的GET 请求中执行 FQL。
    • 救命!如果 Facebook 像 Google 一样使用固定用户 ID,则无需进行此项检查。
    猜你喜欢
    • 2015-02-25
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多