验证特定应用程序的Facebook访问令牌
我需要验证我的iPhone应用程序上的用户是否真正登录到我的Facebook应用程序。我可以通过使用他们的访问令牌检索用户id来验证他们的用户id:验证特定应用程序的Facebook访问令牌,facebook,api,authentication,Facebook,Api,Authentication,我需要验证我的iPhone应用程序上的用户是否真正登录到我的Facebook应用程序。我可以通过使用他们的访问令牌检索用户id来验证他们的用户id: 我预见到的安全问题是,他们可以向我发送任何有效的访问令牌,它将返回他们的用户id。我还需要验证此令牌是否用于我的特定应用程序。是否有方法在此请求中返回应用程序ID以验证该请求?是。您可以查询: https://graph.facebook.com/app?access_token=TOKEN 它将返回创建访问令牌的应用程序的名称、id和一些统计
我预见到的安全问题是,他们可以向我发送任何有效的访问令牌,它将返回他们的用户id。我还需要验证此令牌是否用于我的特定应用程序。是否有方法在此请求中返回应用程序ID以验证该请求?是。您可以查询:
https://graph.facebook.com/app?access_token=TOKEN
它将返回创建访问令牌的应用程序的名称、id和一些统计信息。Facebook现在支持调试访问令牌。通过向
debug\u令牌
连接发出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
}
}
您可以在参考中获得更多信息。这是我在Python 3中的实现,实现了一个Facebook批处理请求。 这将在一次呼叫中为您获取绑定到用户访问令牌的应用程序和用户数据
#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风格的方法来实现我编写的一些编码调用,但我只是想展示什么对我来说确实有效。您可以在api调用中使用
appsecret\u proof
从:
访问令牌是可移植的。可以使用访问令牌
由Facebook的SDK在客户端生成,发送到服务器,然后
代表客户端从该服务器进行调用
您可以通过将appsecret\u-proof参数添加到每个
来自服务器的API调用,并启用需要验证的设置
所有电话。这可以防止坏人使用您的API调用
从其服务器访问令牌
例如:
https://graph.facebook.com/app?access_token=TOKEN&appsecret_proof=<app secret proof>
您现在可以相信您得到的响应可以用于身份验证。因此,要检查用户的访问令牌是否属于我的应用程序,我需要向Facebook发出两个API请求?不一定。您可以在一个API请求中使用,也可以在
用户
和应用程序
表中使用。您可以在一个简单的GET
请求中执行FQL。救生圈!如果Facebook像谷歌一样使用固定的用户ID,这个检查就没有必要了。我很困惑。你为什么要拿一个外部代币?更重要的是,你是如何要求用户给你的?传递令牌是一个安全问题——如果有人得到了它,他们可以模拟用户和您的应用程序。你应该使用FB iOS SDK要求用户从你的应用程序内部登录Facebook。我是。他们在我的iphone应用程序上登录我的facebook应用程序。问题是某些操作必须通过我的API在服务器上完成/验证。由于facebook是我的应用程序的身份验证/身份管理系统,当他们对我的服务器进行某些API调用时,我需要验证用户是否是他们所说的用户。他们传递他们的用户id和访问令牌,我在服务器上验证。我明白了。这是一个有趣的场景。你介意给我发一封简短的电子邮件给fb.com上的francip吗?我想确保SDK人员正在考虑客户端和服务器应用程序之间的身份传输。可能与“input_token”重复?@SeanThompson:这是您想要获取信息的访问令牌。我也更新了参考资料。好吧,我很困惑。那么输入令牌基本上就是您要验证的用户令牌,而访问令牌就是您的应用令牌?我把术语弄混了。因此,我猜我必须在某个地方保存对我的应用令牌的引用警告:这已更改,因此只有发给开发人员帐户的令牌才能与之一起使用。谢谢!我已经根据新文档更新了答案。非常感谢!这不是最好的蟒蛇方式,但效果很好
$endpoint = sprintf(
'https://graph.facebook.com/app?access_token=%s&appsecret_proof=%s',
urlencode($accessToken),
urlencode(
hash_hmac('sha256', $accessToken, $appSecret)
)
);