61

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

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

简而言之,你无法从中推断出任何东西。我还找到了access token debugger,如果您将令牌粘贴进去,它会显示我正在寻找的信息,这很好,但不能帮助我以编程方式进行操作。

关键是,如果有人为用户获取令牌,他可以使用它来访问图表,这就是我在我的应用程序中所做的 - 我想确保人们正在转发我的应用程序颁发给他们的令牌,而不是另一个。

我的申请流程是:

  1. 从 facebook 获取访问令牌(没什么特别的,按照此处描述的方式,服务器端流程。(也使用 iPhone 和 android,但如果我没记错的话,它们有类似的流程))
    [设备] <-> [facebook ]
  2. 使用该访问令牌,设备将使用令牌
    [device] <-> [Jonathan's application]
    在我的服务器上访问我的应用程序服务器,我将访问令牌附加到用户并使用它在我的应用程序中向该用户授予权限。(使用 facebook 连接对用户进行身份验证)


我的应用程序是安全的,并且无论facebook如何,完成的访问都经过身份验证,但是!在这个流程中,我发现的一个薄弱环节是我无法确定我获得的访问令牌是为我的应用程序签名的 - 我不喜欢它,因为我缓存令牌以供离线使用,我希望 100% 确定它们适用于我的应用程序,具有我的权限。

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

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

(编辑:使用 C# SDK,如果重要的话。但是提供该信息的图形/休息调用也一样好:))

4

4 回答 4

64

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

这将返回生成此令牌的应用程序,您可以将其与应用程序的 id 进行比较。

于 2012-01-04T16:47:57.250 回答
25

用于检查访问令牌的官方图形端点是:

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 端点将失败。

相关脸书文档:

于 2013-06-05T18:14:31.577 回答
5

确保这一点的记录方法是使用appsecret_proof.

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

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

PROOF您可以在 C# 中使用此(从此处)派生上述内容:

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);
于 2016-04-11T17:25:45.497 回答
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/

我做了一个截图,以便可以看到时间,如果您有兴趣,可以找到更多信息。

脸书视频截图

于 2017-03-06T13:55:06.073 回答