【问题标题】:Decrypt OAuth 2.0 access token解密 OAuth 2.0 访问令牌
【发布时间】:2011-11-09 13:53:45
【问题描述】:

是否可以解密 Facebook 的新 OAuth 2.0 access_token ?

我需要从 access_token 中获取 user_id 和 app_id。

PS:

我只需要像 Facebook Linter 过去那样从 access_token 获取 user_id 和 app_id。

【问题讨论】:

  • 您必须使用已注册的app_id 来获取access_token,并且您可以通过访问Graph API URL /me/access_token 获取user_id。如果不尝试解密access_token,您没有/无法获得所需数据的任何原因?
  • 我只需要像 Facebook Linter 过去那样从 access_token 获取 user_id 和 app_id。
  • 请澄清您的问题并详细说明您想做什么。 user_idapp_idaccess_token 的先决条件,因此将其反转是荒谬的。正如其他人所概述的,只要令牌有效,您始终可以对 /me/ 进行简单的 API 调用以检索关联的 user_id。如果令牌不再有效,那么您就不走运了。
  • 您可能将access_token 与传递给您的应用程序的signed_request 混淆了。仅当用户登录并授予您的应用程序访问其帐户的权限时,签名请求必须被解码并包含access_token。如果他们是用户会话,则 signed_request 还包含“user_id”。 signed_request 仅在初始 POST 加载时的画布上下文中可用,此时您的应用正在 Facebook iframe 中加载。

标签: facebook oauth-2.0


【解决方案1】:

通常您使用 access_token 从您的应用程序中访问其他数据。例如,您的应用程序将对用户进行身份验证,然后使用访问令牌访问 FB 的 API 中的其他功能,例如图形:

https://graph.facebook.com/me?access_token=<access_token>

【讨论】:

  • 我知道怎么用。我希望能够像以前一样从访问令牌中获取 user_id 和 app_id ..
  • 是的,您可以使用该地址“graph.facebook.com/me”从图表中获取 user_id,而 app_id 是一个静态 ID,无论如何设置您的应用程序都应该知道它。或者,您可以使用 Facebook 的 SDK 之一,这会使这一切变得更加容易。
【解决方案2】:

没有公开的方式来解密访问令牌以获取用户 ID 和应用 ID。这也很可能严重违反 Facebook 政策。

首先要获得访问令牌,您必须有权访问用户和应用程序 ID,因此您不需要这样做。如果您实际上无权访问用户或应用程序 ID,那么我的猜测是您可能甚至不应该拥有他们的访问令牌并且可能已经“非法”获得它......

【讨论】:

    【解决方案3】:

    如果您仔细查看访问令牌本身,这实际上是一项非常简单的任务。它由 3 个段组成,由管道字符分隔,|

    APP_ID|SOME_STUFF.NUMBER-USERID|SOME_MORE_STUFF
    

    我不确定 SOME_STUFFNUMBERSOME_MORE_STUFF 是什么;可能是 Facebook 用来跟踪 access_token 有效性等的时间戳、签名或其他编码数据。

    除非您通过其他方式获得了有问题的 acces_token,否则我认为能够从它们访问 APP_ID 和 USER_ID 没有问题(Facebook 显然也没有)。所以我要说的就是负责任:)

    要记住的另一件事是,这不是标准或任何东西,并且可能会发生变化。所以,也要注意这一点。

    【讨论】:

    • 在 Facebook 推出加密的 access_token 之前就是这种情况。我以前用过。
    • 有趣;不知何故,我没有意识到这种变化。 roadmap 说到 9 月 1 日 access_token 将被加密,但我的应用程序仍在获得未加密的令牌。我想我应该升级它们:P
    • 猜你有Encrypted Access Token:在高级设置中禁用:p
    • 我做的...有趣的是我从来没有注意到那个设置。在这种情况下,您可能不走运;如果加密很容易破解,那么加密access_key 将毫无意义;你可以试试crypto.stackexchange.com
    • 无论哪种方式,如果令牌被盗,它可以使用,所以我不知道他们为什么这样做。 I asked 虽然;也许有人知道我不知道的事情。
    【解决方案4】:

    如果访问令牌采用加密格式,则无法通过编程方式确定用户 ID 和应用 ID。

    我很难想出一种合法的方式,因为您可能知道自己的 App ID 和存储访问令牌所针对的用户 ID,因此您可以在没有这两条信息的情况下遇到访问令牌。

    尽管如此,假设有一个合法的用例: 调用/me?fields=id 将返回用户ID 和/或您可以使用https://developers.facebook.com/tools/debug 的调试工具来调试访问令牌的其他属性

    【讨论】:

    • 很遗憾,调试工具无法使用加密的 access_token。这是最初的问题。
    • 调试工具应该适用于所有访问令牌,如果您还没有这样做,我建议您在 bugs.developers.facebook.net 提交一个错误
    • graph.facebook.com/me/… 声称 access_token 已加密,即"message": "The access token could not be decrypted",
    • 那么您所拥有的可能不是有效的访问令牌 - 如果是,您的应用程序密码可能已更改并且旧令牌不兼容?
    【解决方案5】:

    您不必解密访问令牌

    就 AppID 而言,当你在那里制作应用程序时,你应该从 facebook 获取它,它是你连接到 facebook 的 id。

    facebook 发送 userId 和 accesstoken.. 只需在浏览器中检查您的 cookie,或者在 oauth 情况下检查请求访问令牌时返回的整个字符串。

    【讨论】:

      【解决方案6】:

      您确定您在这里谈论的是访问令牌而不是签名请求吗?

      当您加载 Facebook 应用程序时,您有一个签名的请求对象,其中包含我相信您正在寻找的信息(但是,如果用户没有授权您的应用程序,他们的用户 ID 将不会出现在签名的请求中,Facebook安全)

      【讨论】:

        【解决方案7】:

        目前唯一可用的方法是使用 Facebook Access Token Lint Tool。 您可以考虑将流程自动化。

        【讨论】:

          【解决方案8】:

          正如其他人已经指出的那样,access_token 是一个唯一的随机字符串,因此不能这样解密。另外,我们都知道user_idapp_id 是首先生成令牌的先决条件。

          但是,假设您将令牌存储在数据库中并且丢失了关联的 user_idapp_id。在这种情况下,如何在手头只有令牌的情况下检索它们是一个有效的问题。如果您的令牌仍然有效,这是可能的。如果它过期了,那你就不走运了。

          要检索 user_id,请致电:

          https://graph.facebook.com/me?fields=id&access_token=xxx
          

          要检索 app_id,请致电:

          https://graph.facebook.com/app?fields=id&access_token=xxx
          

          在这两种情况下,关联的 id 都将成为 JSON 响应的一部分,无论 access_token 是加密的还是未加密的。

          让我们用一个例子来说明这一点。假设马克扎克伯格使用Graph API Explorer 生成access_token。调用 /me 端点会给你:

          {
            "id": "68310606562"
          }
          

          调用/app 端点会给你:

          {
            "id": "145634995501895"
          }
          

          您正在寻找的 id 是响应的一部分。

          请注意,这不适用于https://developers.facebook.com/apps 上显示的access_token(不确定这是 Facebook 的错误还是故意的)。请使用您的应用通过 OAuth 收到的 access_token

          【讨论】:

          • 我认为这就是我要找的。我会尝试并告诉你。
          • 如果我使用加密的 access_token 将浏览器指向 https://graph.facebook.com/me?fields=id&amp;access_token=xxx,我会得到 { "error": { "type": "OAuthException", "message": "Error validating application." } }
          • 您确定您的access_token 仍然有效吗?
          • 是的,伙计。这是有效的。如果 access_token 被加密,它会为每个请求执行此操作。
          • 我很想帮忙,但我不明白。这些是普通的标准 API 调用。除非令牌无效,否则他们没有理由因为加密的access_token 而失败。否则,令牌将完全无用。你真的可以用你的令牌做任何事情吗?