Facebook 从用户访问令牌获取应用程序id(或验证源应用程序是否有令牌)
我发现了这个,这有一个答案,但facebook从那时起改变了令牌格式,现在它是这样的:Facebook 从用户访问令牌获取应用程序id(或验证源应用程序是否有令牌),facebook,facebook-c#-sdk,oauth-2.0,facebook-oauth,Facebook,Facebook C# Sdk,Oauth 2.0,Facebook Oauth,我发现了这个,这有一个答案,但facebook从那时起改变了令牌格式,现在它是这样的: AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD 简言之,你无法从中推断出任何东西。 我还找到了,它显示了我在粘贴令牌时要查找的信息,这很好,但不能帮助我以编程方式完成 关键是,如果有人为用户获取令牌,他可以使用它访问图形,这就是我在应用程序中所做的-我想确保人们转发的是我
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
简言之,你无法从中推断出任何东西。
我还找到了,它显示了我在粘贴令牌时要查找的信息,这很好,但不能帮助我以编程方式完成
关键是,如果有人为用户获取令牌,他可以使用它访问图形,这就是我在应用程序中所做的-我想确保人们转发的是我的应用程序发给他们的令牌,而不是其他令牌
我的申请流程是:
[设备][脸书]
[设备][乔纳森的应用程序]
在我的服务器上,我将访问令牌附加到该用户,并使用该令牌在我的应用程序中向该用户授予权限。(使用facebook连接验证用户身份)
我的应用程序是安全的,并且无论facebook如何,访问都是经过身份验证的,但是!在这个流程中,我发现的一个薄弱环节是,我无法验证我获得的访问令牌是否已为我的应用程序签名-我不喜欢它,因为我缓存令牌以供脱机使用,我希望100%确保它们用于我的应用程序,并具有我的权限。
那么,验证我获得的令牌是否与我的应用程序相关的(最佳)方法是什么(对于与用户的关系,我使用令牌访问/me,并查看该令牌用于哪个用户) 我不需要解密令牌(我猜这是某种AES),我只是在寻找一个端点,它会告诉我令牌与我的应用程序id匹配 (编辑:如果有必要的话,可以使用C#SDK。但是一个图形/rest调用来提供这些信息也很好:)
这将返回生成此令牌的应用程序,您可以将其与应用程序的id进行比较。检查访问令牌的官方图形端点为:
GET graph.facebook.com/debug_token?
input_token=[user_access_token]&
access_token=[app_token_or_admin_token]
答复示例:
{
“数据”:{
“应用程序id”:1384839580948,
“应用程序”:“社交咖啡馆”,
“到期时间”:1352419328,
“是否有效”:正确,
“发布时间”:1347235328,
“元数据”:{
“sso”:“iphone safari”
},
“范围”:[
“电子邮件”,
“发布操作”
],
“用户id”:1207059
}
}
app\u token\u或\u admin\u token
可以使用图形API调用获得:
GET graph.facebook.com/oauth/access_token?
client_id={app-id}
&client_secret={app-secret}
&grant_type=client_credentials
如果用户访问令牌不属于生成应用令牌或管理令牌的应用,则调试令牌终结点将失败
相关facebook文档:
- 检查访问令牌:
- 应用程序令牌:
证明
:
公共静态字符串计算HMACSHA256HASH(字符串值到HASH,字符串键)
{
byte[]keyBytes=Encoding.ASCII.GetBytes(key);
byte[]valueBytes=Encoding.ASCII.GetBytes(valueToHash);
byte[]tokenBytes=新的HMACSHA256(keyBytes).ComputeHash(valueBytes);
valueBytes=null;
keyBytes=null;
StringBuilder令牌=新的StringBuilder();
foreach(令牌字节中的字节b)
{
AppendFormat(“{0:x2}”,b);
}
tokenBytes=null;
返回token.ToString();
}
ComputeHmacSha256Hash(accessToken,appSecret);
为什么不使用官方的做事方式?这是FB自己的视频关于安全的请求
请求:
https://graph.facebook.com/debug_token?input_token={token to check}&access_-token={app_-id}{app_-secret}
响应:
“数据”:{“应用程序id”:{令牌应用程序id},“用户id”:{令牌用户id},…}
官方视频链接:
我做了一个屏幕截图,这样时间是可见的,如果你有兴趣,你可以找到更多的信息
这是facebook的一项有案可稽的功能,还是只是目前正在使用的功能?看起来您正在这样做:(步骤2)但使用的是用户访问令牌,而不是应用程序访问令牌。或者这是应用程序id,而不是字面上的“应用程序”?我会试试的。好的,我正在升级这个,因为它可以工作,但是我还没有在FBAPI中看到这个文档。不是api_id,而是url中的文字“app”。响应是一些JSON,包括应用程序id(响应中简称为“id”。太好了!请参阅下面我的回答,以了解官方方式,而不是一些碰巧起作用的魔法:)这是一个很棒的问题,也是一个很好的答案。这对我来说也是一个缺失的环节。谢谢你,还有可能重复我一直在尝试这个,我要么在OAuth 2.0方法上得到
unknown,debug\u token
,要么它告诉我缺少client\u id
或者redirect\u uri
,如果我不包括这些。官方文档中仍然包含此步骤,所以有什么想法吗?谢谢。其他人注意:此处必须包含文字“|”字符(不表示“或”)access_token={app_id}{app_secret}
这是错误的。尝试了这么长时间,但一次确认就无效,这是最好的方法。若为另一个应用程序生成了appsecret_证明,则尽管令牌有效,它仍将抛出错误。此外,appsecret\u proof可以附加到API的任何方法。V4.0不再支持,需要使用access\u token
,这是应用程序访问令牌
GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]