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

Facebook 从用户访问令牌获取应用程序id(或验证源应用程序是否有令牌),facebook,facebook-c#-sdk,oauth-2.0,facebook-oauth,Facebook,Facebook C# Sdk,Oauth 2.0,Facebook Oauth,我发现了这个,这有一个答案,但facebook从那时起改变了令牌格式,现在它是这样的: AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD 简言之,你无法从中推断出任何东西。 我还找到了,它显示了我在粘贴令牌时要查找的信息,这很好,但不能帮助我以编程方式完成 关键是,如果有人为用户获取令牌,他可以使用它访问图形,这就是我在应用程序中所做的-我想确保人们转发的是我

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

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
简言之,你无法从中推断出任何东西。 我还找到了,它显示了我在粘贴令牌时要查找的信息,这很好,但不能帮助我以编程方式完成

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

我的申请流程是:

  • 从facebook获取访问令牌(服务器端流中描述的方式没有什么特别之处。(也使用iPhone和android,但如果我没记错的话,它们有类似的流))
    [设备][脸书]
  • 使用该访问令牌,设备将使用该令牌访问我的应用程序服务器
    [设备][乔纳森的应用程序]
    在我的服务器上,我将访问令牌附加到该用户,并使用该令牌在我的应用程序中向该用户授予权限。(使用facebook连接验证用户身份)

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

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

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

    (编辑:如果有必要的话,可以使用C#SDK。但是一个图形/rest调用来提供这些信息也很好:)


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

    检查访问令牌的官方图形端点为:

    GET graph.facebook.com/debug_token?
          input_token=[user_access_token]&
          access_token=[app_token_or_admin_token]
    
    答复示例:

    {
    “数据”:{
    “应用程序id”:1384839580948,
    “应用程序”:“社交咖啡馆”,
    “到期时间”:1352419328,
    “是否有效”:正确,
    “发布时间”:1347235328,
    “元数据”:{
    “sso”:“iphone safari”
    }, 
    “范围”:[
    “电子邮件”,
    “发布操作”
    ], 
    “用户id”:1207059
    }
    }
    
    app\u token\u或\u admin\u token
    可以使用图形API调用获得:

    GET graph.facebook.com/oauth/access_token?
         client_id={app-id}
        &client_secret={app-secret}
        &grant_type=client_credentials
    
    如果用户访问令牌不属于生成应用令牌或管理令牌的应用,则调试令牌终结点将失败

    相关facebook文档:

    • 检查访问令牌:

    • 应用程序令牌:


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

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

    您可以使用以下内容(从中)在C#中导出上面的
    证明

    公共静态字符串计算HMACSHA256HASH(字符串值到HASH,字符串键)
    {
    byte[]keyBytes=Encoding.ASCII.GetBytes(key);
    byte[]valueBytes=Encoding.ASCII.GetBytes(valueToHash);
    byte[]tokenBytes=新的HMACSHA256(keyBytes).ComputeHash(valueBytes);
    valueBytes=null;
    keyBytes=null;
    StringBuilder令牌=新的StringBuilder();
    foreach(令牌字节中的字节b)
    {
    AppendFormat(“{0:x2}”,b);
    }
    tokenBytes=null;
    返回token.ToString();
    }
    ComputeHmacSha256Hash(accessToken,appSecret);
    
    为什么不使用官方的做事方式?这是FB自己的视频关于安全的请求

    请求:
    https://graph.facebook.com/debug_token?input_token={token to check}&access_-token={app_-id}{app_-secret}

    响应:
    “数据”:{“应用程序id”:{令牌应用程序id},“用户id”:{令牌用户id},…}

    官方视频链接:

    我做了一个屏幕截图,这样时间是可见的,如果你有兴趣,你可以找到更多的信息


    这是facebook的一项有案可稽的功能,还是只是目前正在使用的功能?看起来您正在这样做:(步骤2)但使用的是用户访问令牌,而不是应用程序访问令牌。或者这是应用程序id,而不是字面上的“应用程序”?我会试试的。好的,我正在升级这个,因为它可以工作,但是我还没有在FBAPI中看到这个文档。不是api_id,而是url中的文字“app”。响应是一些JSON,包括应用程序id(响应中简称为“id”。太好了!请参阅下面我的回答,以了解官方方式,而不是一些碰巧起作用的魔法:)这是一个很棒的问题,也是一个很好的答案。这对我来说也是一个缺失的环节。谢谢你,还有可能重复我一直在尝试这个,我要么在OAuth 2.0方法上得到
    unknown,debug\u token
    ,要么它告诉我缺少
    client\u id
    或者
    redirect\u uri
    ,如果我不包括这些。官方文档中仍然包含此步骤,所以有什么想法吗?谢谢。其他人注意:此处必须包含文字“|”字符(不表示“或”)
    access_token={app_id}{app_secret}
    这是错误的。尝试了这么长时间,但一次确认就无效,这是最好的方法。若为另一个应用程序生成了appsecret_证明,则尽管令牌有效,它仍将抛出错误。此外,appsecret\u proof可以附加到API的任何方法。V4.0不再支持,需要使用
    access\u token
    ,这是应用程序访问令牌
    GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]