解密 OAuth 2.0 访问令牌

10

是否有可能解密Facebook的新OAuth 2.0访问令牌?

我需要以某种方式从访问令牌中获取user_id和app_id。

PS:

我只需要从访问令牌中获取user_id和app_id,就像Facebook Linter曾经做过的那样。


1
你必须使用已注册的app_id来获取access_token,并且可以通过访问Graph API URL /me/来从access_token中获取user_id。有没有不尝试解密access_token就无法获得您想要的数据的原因? - jches
我需要从access_token中仅获取user_id和app_id,就像Facebook Linter曾经做过的那样。 - glarkou
1
请澄清您的问题并详细说明您想要做什么。user_idapp_idaccess_token的先决条件,因此反转这一点是没有意义的。正如其他人所概述的那样,只要令牌有效,您可以随时进行简单的API调用以检索相关的user_id。如果令牌不再有效,则您将无法使用它。 - kongo09
你可能将 access_token 和传递给你的应用程序的 signed_request 混淆了。必须对 signed_request 进行解码,只有当用户已登录并授权您的应用程序访问其帐户时,signed_request 才包含 access_token。如果存在用户会话,则 signed_request 还包含 'user_id'。signed_request 仅在初始 POST 加载中的画布上下文中可用,在此处,您的应用程序正在 Facebook iframe 中加载。 - qodeninja
8个回答

24

正如其他人所指出的那样,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
无论access_token是加密还是未加密的,相关的id都将作为JSON响应的一部分。让我们通过一个例子来说明这一点。假设马克·扎克伯格使用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&access_token=xxx,我会得到以下结果:{ "error": { "type": "OAuthException", "message": "Error validating application." } } - glarkou
是的,伙计。这是有效的。如果访问令牌被加密,它会为每个请求执行此操作。 - glarkou
我很乐意提供帮助,但我不理解。这些都是普通的标准API调用。除非令牌无效,否则对加密的access_token调用将没有失败的原因。否则,该令牌将是完全无用的。您是否能够使用您的令牌来实际执行任何操作? - kongo09
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/3249/discussion-between-kongo09-and-salamis - kongo09
嗯...真的很奇怪。因为我是从开发者部分获取access_tokens的。你有指定你的应用程序是画布应用程序吗?在提供的示例中,你使用的是来自Graph Explorer而不是常规Canvas应用程序的访问令牌,对吧?我刚刚尝试了一下通过Graph API explorer从常规应用程序获取access_token,它可以工作。但是给出的access_token与https://developers.facebook.com/apps/上显示的特定应用程序的`access_token`不同。所以你可能是正确的。它应该可以工作。 - glarkou
显示剩余5条评论

2
如果访问令牌以加密格式存在,则没有编程方法可以确定用户ID和应用程序ID。
我很难想象你如何在没有这两个信息的情况下获得访问令牌,因为假设你知道自己的应用程序ID和存储访问令牌的用户ID。
尽管如此,假设有一个合法的用例:调用/me?fields=id将返回用户ID,或者您可以使用https://developers.facebook.com/tools/debug上的调试工具来调试访问令牌的其他属性。

很遗憾,调试工具无法使用加密的access_token。这就是最初的问题。 - glarkou
调试工具应该能够与所有访问令牌一起使用,如果您还没有这样做,我建议在bugs.developers.facebook.net上报告错误。 - Igy
https://graph.facebook.com/me/inbox?access_token=EAACObiYvrpMBAFp5XOFDRWfJmZCwS1TRleCXn0XTD913GrMxw6jIqWI3x4BNNZBT8Re29ZAv4EYdW6hkcMrumfsZD 声明 access_token 已加密,即 "message": "The access token could not be decrypted", - evandrix
那么,您可能拥有的不是有效的访问令牌 - 如果是,也许您的应用程序密钥已更改,旧令牌不兼容? - Igy

0
通常情况下,您使用access_token从应用程序中访问其他数据。例如,您的应用程序将对用户进行身份验证,然后使用访问令牌访问FB API中的其他功能,如图形:
https://graph.facebook.com/me?access_token=<access_token>

我知道如何使用它。我希望能够像以前一样从访问令牌中获取用户ID和应用程序ID。 - glarkou

0

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

APP_ID|SOME_STUFF.NUMBER-USERID|SOME_MORE_STUFF

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

除非你是通过不当手段获得了相关的access_token,否则我认为从中访问APP_ID和USER_ID并没有问题(显然Facebook也是这样认为的)。所以我只想说要负责任 :)

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


那是在Facebook引入加密的access_token之前的情况。我以前用过那个。 - glarkou
有趣;不知怎么的,我没有意识到这个变化。路线图上说到9月1日之前access_token将被加密,但是我的应用仍然获取未加密的token。看来我应该升级它们 :P - jches
假设您有“加密访问令牌:Disable in the Advance Settings :p”,请在高级设置中禁用它。 - glarkou
我做了那个...有趣的是我从没注意过那个设置。在这种情况下,你可能没有什么运气;如果加密很容易被破解,加密access_key就毫无意义了;你可以试着去http://crypto.stackexchange.com/问问。 - jches
无论如何,如果令牌被盗,它都可以被使用,所以我不知道他们为什么这样做。虽然我已经问过了,也许有人知道我不知道的事情。 - jches

0

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

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


0

你不需要解密访问令牌

就AppID而言,当你在Facebook上创建应用程序时,你应该从那里获取它,这是连接到Facebook的ID。

Facebook会随着访问令牌一起发送userId。 只需检查浏览器中的cookie或在oauth情况下检查请求访问令牌时返回的整个字符串即可。


0
你确定你说的是Access Token而不是签名请求吗?
当你的Facebook应用程序被加载时,你会有一个签名请求对象,其中包含了我认为你正在寻找的信息(但是如果用户没有授权你的应用程序,他们的用户ID将不会出现在签名请求中,这是Facebook的安全机制)。

0
目前唯一可用的方法是使用Facebook Access Token Lint工具。您可以考虑自动化这个过程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接