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

Jon*_*son 59 facebook oauth-2.0 facebook-c#-sdk facebook-oauth

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

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
Run Code Online (Sandbox Code Playgroud)

简而言之,你无法从中推断出任何东西.我还找到了访问令牌调试器,它显示了我正在寻找的信息,如果你粘贴一个令牌,这很好,但不能帮助我以编程方式进行.

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

我的申请流程是:

  1. 从Facebook获取访问令牌(没有什么特别的,就像在这里描述的那样,服务器端流.(也是iPhone和Android和使用,但如果我没记错的话他们有类似的流程))
    [设备] < - > [facebook ]
  2. 使用该访问令牌,设备将使用令牌
    [device] < - > [Jonathan的应用程序] 访问我的应用程序服务器
    在我的服务器上,我将访问令牌附加到用户并使用它来为我的应用程序中的该用户授予权限.(使用facebook连接验证用户)


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

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

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

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

小智 61

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

这将返回为此令牌生成的应用,您可以将其与应用的ID进行比较.

  • https://developers.facebook.com/docs/facebook-login/access-tokens#debug (2认同)

via*_*lly 24

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

GET graph.facebook.com/debug_token?
      input_token=[user_access_token]&
      access_token=[app_token_or_admin_token]
Run Code Online (Sandbox Code Playgroud)

响应示例:

{
    "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
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果user_access_token不属于生成app_token_or_admin_token的应用程序,则debug_token端点将失败.

相关的facebook文档:


Nun*_*ces 5

有文件证明这是确保使用的方法appsecret_proof.

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]
Run Code Online (Sandbox Code Playgroud)

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

你可以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);
Run Code Online (Sandbox Code Playgroud)