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

时间:2011-11-15 18:11:21

标签: facebook facebook-c#-sdk oauth-2.0 facebook-oauth

我找到了这个question,它有一个答案,但从那时起facebook更改了令牌格式,现在它就像:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

简而言之,你无法从中推断出任何东西。 我还找到了access token debugger,它显示了我正在寻找的信息,如果你粘贴一个令牌,这很好,但不能帮我编程。

重点是,如果有人获得了用户的令牌,他可以使用它来访问图表,这就是我在我的应用程序中所做的事情 - 我想确保人们转发由他们发出的令牌我的申请,而不是另一个。

我的申请流程是:

  1. 从Facebook获取访问令牌(没有什么特别的,就像它在here中所描述的那样,服务器端流。(也是iPhone和android并使用过,但如果我没记错的话,它们会有类似的流程))<登记/> [设备]&lt; - &gt; [Facebook的]
  2. 使用该访问令牌,设备将使用令牌
    来访问我的应用程序服务器 [设备]&lt; - &gt; [乔纳森的申请]
    在我的服务器上,我将访问令牌附加到用户,并使用它来为我的应用程序中的该用户授予权限。 (使用facebook连接验证用户)

  3.     我的应用程序是安全的,无论facebook如何,访问完成也都经过身份验证,但是!在这个流程中,我发现的弱链接是我无法验证我获得的访问令牌是否已经为我的应用程序签名 - 我不喜欢它,因为我将令牌缓存用于离线使用,我希望100%确定他们是我的申请,我的权限。

    那么验证我获得的令牌与我的应用程序相关的(最佳)方式是什么(对于与用户的关系,我使用令牌访问/我并查看此令牌所针对的用户)

    我不需要解密令牌(我猜它是某种AES),我只是在找一个会告诉我令牌与我的应用ID匹配的端点。

    (编辑:使用C#SDK,如果重要..但是图形/休息调用以提供该信息同样好:))

4 个答案:

答案 0 :(得分:60)

https://graph.facebook.com/app/?access_token=[user_access_token]

这将返回为此代币生成的应用,您可以将其与应用的ID进行比较。

答案 1 :(得分:24)

检查访问令牌的官方图终端是:

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
    }
}

app_token_or_admin_token可以使用Graph API调用获取:

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文档:

答案 2 :(得分:5)

确保这一点的文件化方法是使用appsecret_proof

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]

这不仅验证它是有效令牌,还验证令牌属于应用程序。它还可以一次性获取用户数据。

您可以使用此方法(来自here)在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);

答案 3 :(得分:4)

为什么不使用官方的做事方式?以下是FB自己关于安全性的视频的请求。

请求: 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}, ... }

链接到官方视频:https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

我制作了截图,以便时间可见,如果您有兴趣,可以找到更多信息。

Facebook video screenshot