如何使用 Oauth2.0 解码不透明的访问令牌

Posted

技术标签:

【中文标题】如何使用 Oauth2.0 解码不透明的访问令牌【英文标题】:How to decode opaque Access Token with Oauth2.0 【发布时间】:2020-12-12 20:47:52 【问题描述】:

我有一个令牌密钥,其中包含登录的个人电子邮件地址以及姓名和其他端点。这实际上用于 xero API 连接。

scope = 'offline_access accounting.reports.read accounting.settings.read openid profile email'

我需要解码此令牌密钥并获取登录的电子邮件地址和登录人的姓名。

例如,我的令牌密钥如下。

b9b73c12b40a3bc1441f5bda331c4d7c64c0394956d5105eec61a71de19f8153

如何解码这个不透明的访问令牌并使用 python 获取相关信息。

【问题讨论】:

您的令牌看起来像您在示例中显示的那样(没有 JWT,可能是不透明的令牌)还是看起来像 eyJxxxxx.eyxxxxx.yyyyyy 的 JWT(由. 分隔的三个部分第 1 部分和第 2 部分以“ey”开头)? @jps 嗨,是的,令牌密钥看起来像我提供的方式。我们可以解码它并获取用户电子邮件地址,以及我该怎么做,谢谢您的合作 我也使用了 OAuth2.0 我编辑了问题以反映这个不透明的访问令牌 opaque tokens 的本质是它们不应该被你解码/解密。 【参考方案1】:

客户端不应该直接解码访问令牌,正如 jps 所说。您有以下选择:

从 ID 令牌中读取用户字段

UI 直接读取此 JWT,如 Step 18 of my blog post。 id 令牌始终具有 JWT 格式,旨在供客户端读取

使用用户信息端点

UI 可以使用上述博文第 24 步中的消息将访问令牌发送到用户信息端点。

从 API 获取用户信息

这往往是最具扩展性的选项,因为您可以返回任何您想要的信息,而且您不受访问令牌中包含的内容的限制。博文的第 27 步使用了此选项。

【讨论】:

【参考方案2】:
const token = req.headers.authorization.split(" ")[1]; //Bearer +token
const decodedToken = jwt.verify(token, "secret_message_long_string");
req.userData =  email: decodedToken.email, userId: decodedToken.userId ;

这个例子是为nodejs解码数据。

在 python 中尝试同样的方法。导入 jwt 并使用方法 verfiy 将令牌和秘密字符串作为参数传递。

【讨论】:

对不起,这个答案没有多大意义。问题是关于 python 的,但你回答的是 node.js。然后问题没有显示 JWT,而是显示不透明的令牌,因此该代码不起作用。即使在 JWT 的情况下,已经有很多答案展示了如何解码 JWT,所以无论如何它都是重复的答案。

以上是关于如何使用 Oauth2.0 解码不透明的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何获取 google plus 访问令牌?

oauth2.0如何传递访问令牌

如何识别OAuth令牌是否已过期?

使用 OAuth 2.0 访问令牌访问 Gmail Imap

如何在 Gatling 负载测试中为多个虚拟用户使用单个 OAuth2.0 令牌

标头中的 OAuth2.0 访问令牌