从用户访问令牌获取应用程序ID(或者validation源应用程序是否有令牌)
我发现这个问题 ,有一个答案,但Facebook从那时起改变了令牌格式,现在它是这样的:
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
总之,你不能从中推断出任何东西。 我还发现访问令牌debugging器 ,它显示了我正在寻找的信息,如果你粘贴一个令牌,这是很好的,但不帮助我以编程方式。
要点是,如果有人为用户获得一个令牌,他可以使用它来访问graphics,这就是我的应用程序 – 我想确保人们正在转发我的应用程序发给他们的令牌,而不是另一个。
我的申请stream程是:
- 从facebook获取访问令牌(没有什么特别的,就像在这里描述的那样,服务器端的stream程(也是iPhone和Android和使用,但如果我没有记错,它们有相似的stream程))
[设备] < – > [脸谱] - 使用该访问令牌,设备将使用令牌访问我的应用程序服务器
[设备] < – > [乔纳森的申请]
在我的服务器上,我将访问令牌附加到用户,并使用它来为我的应用程序中的该用户授予权限。 (使用Facebook连接来validation用户)
我的应用程序是安全的,并且访问完成也是authentication无论Facebook,但! 在这个stream程中,我确定的一个薄弱环节是,我无法确认我获得的访问令牌是否为我的应用程序签名 – 我不喜欢它,因为我将令牌caching为脱机使用,我想100%确定他们是我的应用程序,与我的权限。
那么什么是最好的方式来validation我得到的令牌与我的应用程序(与用户的关系,我使用令牌来访问/我看看这个令牌是哪个用户)
我不需要解密令牌(我想它是某种AES),我只是在寻找一个端点,告诉我这个令牌与我的应用程序ID匹配。
(编辑:使用C#SDK,如果它很重要..但图/rest电话给这个信息是一样好:))
https://graph.facebook.com/app/?access_token=%5Buser_access_token%5D
这将返回这个令牌生成的应用程序,你可以比较你的应用程序的ID。
检查访问令牌的官方graphics端点是:
GET graph.facebook.com/debug_token? input_token=[user_access_token]& access_token=[app_token_or_admin_token]
响应示例:
{ "data": { "app_id": 138483919580948, "application": "Social Cafe", "expires_at": 1352419328, "is_valid": true, "issued_at": 1347235328, "metadata": { "sso": "iphone-safari" }, "scopes": [ "email", "publish_actions" ], "user_id": 1207059 } }
可以使用Graph API调用获取app_token_or_admin_token
:
GET graph.facebook.com/oauth/access_token? client_id={app-id} &client_secret={app-secret} &grant_type=client_credentials
如果user_access_token不属于生成app_token_or_admin_token的应用程序,则debug_token端点将失败。
相关的Facebook文件:
-
检查访问令牌: https : //developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/#checktoken
-
应用程序令牌: https : //developers.facebook.com/docs/facebook-login/access-tokens/#apptokens
有logging的方式来确保这是使用appsecret_proof
。
GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]
这不仅validation它是一个有效的令牌,而且该令牌属于该应用程序。 它也一次性获取用户数据。
你可以在C#中使用这个(从这里 )派生上面的PROOF
:
public static string ComputeHmacSha256Hash(string valueToHash, string key) { byte[] keyBytes = Encoding.ASCII.GetBytes(key); byte[] valueBytes = Encoding.ASCII.GetBytes(valueToHash); byte[] tokenBytes = new HMACSHA256(keyBytes).ComputeHash(valueBytes); valueBytes = null; keyBytes = null; StringBuilder token = new StringBuilder(); foreach (byte b in tokenBytes) { token.AppendFormat("{0:x2}", b); } tokenBytes = null; return token.ToString(); } ComputeHmacSha256Hash(accessToken, appSecret);
为什么不使用官方的做事方式? 这是FB自己的video关于安全性的要求。
请求: https://graph.facebook.com/debug_token?input_token={token-to-check}&access_token={app_id}|{app_secret}
: https://graph.facebook.com/debug_token?input_token={token-to-check}&access_token={app_id}|{app_secret}
token- https://graph.facebook.com/debug_token?input_token={token-to-check}&access_token={app_id}|{app_secret}
响应: "data": { "app_id": {token-app-id}, "user_id": {token-user-id}, ... }
链接到官方video: https : //www.facebook.com/FacebookforDevelopers/videos/10152795636318553/
我做了一个截图,以便时间可见,如果您有兴趣,您可以find更多的信息。