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

Posted

技术标签:

【中文标题】从用户访问令牌获取应用程序 ID(或验证源应用程序的令牌)【英文标题】:Get application id from user access token (or verify the source application for a token) 【发布时间】:2011-12-29 18:34:57 【问题描述】:

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

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

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

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

我的申请流程是:

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

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

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

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

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

【问题讨论】:

很棒的问题,很好的答案。这对我来说也是一个缺失的环节。谢谢 另见***.com/questions/8605703/… Facebook access token server-side validation for iPhone app的可能重复 【参考方案1】:

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

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

【讨论】:

这是一个记录在案的 facebook 功能,还是只是目前发生的事情?看起来您正在这样做:developers.facebook.com/docs/authentication/applications(第 2 步),但使用的是用户访问令牌而不是应用程序访问令牌。还是那是 app_id,而不是字面上的“应用程序”?会试试的。 好的,我赞成这个,因为它有效,但我还没有在 FB api 中看到这个记录。这不是 api_id,而是 url 中的文字“app”。响应是一些 JSON,包括应用程序 ID(在响应中简称为“id”。甜蜜! 在下面查看我的官方回答,而不是一些恰好起作用的巫术:)【参考方案2】:

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

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

检查访问令牌: https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/#checktoken

应用令牌: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens

【讨论】:

我一直在尝试这个,我要么得到Unknwon OAuth 2.0 method, debug_token,要么告诉我我缺少client_idredirect_uri,如果我不包括这些。官方文档还是有这个步骤的,有什么想法吗?【参考方案3】:

确保这一点的书面方法是使用appsecret_proof

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

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

你可以在 C# 中使用这个(来自here)推导出上面的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);

【讨论】:

确认,这是最好的方法。如果为另一个应用程序生成了 appsecret_proof,尽管令牌有效,它仍会抛出错误。此外,appsecret_proof 可以附加到任何 API 方法。 V4.0 不再支持,需要使用access_token 是应用访问令牌【参考方案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/

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

【讨论】:

谢谢。其他人的注意事项:文字“|”必须包含字符(不表示“或”)developers.facebook.com/docs/facebook-login/… 这里access_token =app_id|app_secret这是错误的。 试了这么久也没成功

以上是关于从用户访问令牌获取应用程序 ID(或验证源应用程序的令牌)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jwt 令牌中获取用户 ID?

如何从 JWT 令牌中获取用户 ID

使用用户名和密码进行验证时如何获取 ID 令牌?

Github OAuth提供商 - 获取用户名或ID

如何使用 jQuery 或 php 从 Instagram 令牌获取访问令牌

如何处理 Cognito 上的令牌过期问题