验证特定应用程序的Facebook访问令牌

时间:2013-01-27 02:34:29

标签: facebook api authentication

我需要验证我的iPhone应用程序上的用户是否实际登录到我的Facebook应用程序。我可以通过访问令牌检索用户ID:

  

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

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

4 个答案:

答案 0 :(得分:20)

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

GET /debug_token?
     input_token={input-token}&
     access_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参考中获得有关它的更多信息。

答案 1 :(得分:13)

是。您可以查询:

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

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

答案 2 :(得分:1)

这是我在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"))

实现我编写的一些编码调用可能有更多的pythonic方法,但我只想表明对我来说究竟有什么用。

答案 3 :(得分:0)

您可以在api通话中使用appsecret_proof

来自official documentation

  

访问令牌是便携式的。可以使用访问令牌   通过Facebook的SDK在客户端上生成,然后将其发送到服务器   代表客户端从该服务器进行调用。

  

您可以通过向每个人添加appsecret_proof参数来防止这种情况   来自服务器的API调用并启用该设置以要求证明   所有通话。这可以防止坏人用你的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)
    )
);

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