从用户访问令牌获取应用程序ID(或者validation源应用程序是否有令牌)

我发现这个问题 ,有一个答案,但Facebook从那时起改变了令牌格式,现在它是这样的:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD 

总之,你不能从中推断出任何东西。 我还发现访问令牌debugging器 ,它显示了我正在寻找的信息,如果你粘贴一个令牌,这是很好的,但不帮助我以编程方式。

要点是,如果有人为用户获得一个令牌,他可以使用它来访问graphics,这就是我的应用程序 – 我想确保人们正在转发我的应用程序发给他们的令牌,而不是另一个。

我的申请stream程是:

  1. 从facebook获取访问令牌(没有什么特别的,就像在这里描述的那样,服务器端的stream程(也是iPhone和Android和使用,但如果我没有记错,它们有相似的stream程))
    [设备] < – > [脸谱]
  2. 使用该访问令牌,设备将使用令牌访问我的应用程序服务器
    [设备] < – > [乔纳森的申请]
    在我的服务器上,我将访问令牌附加到用户,并使用它来为我的应用程序中的该用户授予权限。 (使用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更多的信息。

Facebook视频截图