我需要验证我的 iPhone 应用程序上的用户是否确实登录到我的 Facebook 应用程序。我可以通过使用他们的访问令牌检索它来验证他们的用户 ID:
https://graph.facebook.com/me?fields=id&access_token=XXXXXXXXXXXXXXX
我预见的安全问题是,他们可以向我发送任何有效的访问令牌,并且它将返回他们的用户 ID。我还需要验证此令牌是否适用于我的特定应用程序。有没有办法在这个请求中返回应用程序 ID 来验证它?
我需要验证我的 iPhone 应用程序上的用户是否确实登录到我的 Facebook 应用程序。我可以通过使用他们的访问令牌检索它来验证他们的用户 ID:
https://graph.facebook.com/me?fields=id&access_token=XXXXXXXXXXXXXXX
我预见的安全问题是,他们可以向我发送任何有效的访问令牌,并且它将返回他们的用户 ID。我还需要验证此令牌是否适用于我的特定应用程序。有没有办法在这个请求中返回应用程序 ID 来验证它?
Facebook 现在支持调试访问令牌。您可以通过向连接发出 GET 请求来检索与特定访问令牌相关的信息debug_token
。就像是:
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
}
}
您可以在获取有关令牌和调试的信息参考中获得有关它的更多信息。
是的。你可以这样查询:
https://graph.facebook.com/app?access_token=TOKEN
它将返回有关创建访问令牌的应用程序的名称、ID 和一些统计信息。
这是我在 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 的方式来实现我编写的一些编码调用,但我只是想展示什么对我有用。
您可以appsecret_proof
在您的 api 调用中使用。
从官方文档:
访问令牌是可移植的。可以获取 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)
)
);
您现在可以相信您获得的响应可用于身份验证。