如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt

Posted

技术标签:

【中文标题】如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt【英文标题】:How do I view the data stored in a JWT? Using auth0 and express-jwt 【发布时间】:2018-06-20 07:02:05 【问题描述】:

现在我相信我已经正确设置了大多数东西。 Auth0 将 jwt 保存到客户端,然后客户端将其用于将来的请求。我使用 express-jwt 来验证令牌。通过阅读 Auth0 文档,我认为我需要客户端密钥(当我使用它来解码 jwt 时,我得到一个奇怪的错误:UnauthorizedError: error:0906D06C:PEM routines:PEM_read_bio:no start line)所以我只是想知道这个密钥是从哪里来的? 谢谢

仅将 JWT 解码为其签名方案等的当前代码:

const jwtCheck = jwt( secret: jwks.expressJwtSecret( cache: true, rateLimit: true, jwksRequestsPerMinute: 5, jwksUri: '@987654321@' ), audience: '@987654322@', issuer: '@987654323@', algorithms: ['RS256'] );

【问题讨论】:

在您问题中提供的代码中,您使用的是JWKSRS256 - 因此验证令牌不需要客户端密码。由于您提供的信息有限,因此难以进一步发表评论。你想达到什么目的? 抱歉回复晚了,据我所知 Auth0 将用户配置文件编码到 JWT 中,因此您可以访问用户名和电子邮件等。这是我正在尝试阅读的信息 感谢您的澄清 - 所以您想阅读 JWT 正文中的声明。请在下面查看我的答案。 这个网站有助于将 JWT 粘贴进去,并查看它的解码效果 - jwt.io 我的意思是,主机网站可以访问登录用户的用户名,但是如果服务器对令牌进行解码,它只会获取 base 64 解码的内容,而不是已经在令牌 【参考方案1】:

如果您使用的是 express-jwt 中间件,那么负载默认保存在请求对象中,您可以像这样访问它request.user

端点示例:

//jwtMiddleware is express-jwt middleware
app.get('/', jwtMiddleware, function (req, res) 
  console.log(req.user);
  res.send('hello world');
);

【讨论】:

【参考方案2】:

根据 OP 的评论,要读取 JWT 正文的值,只需对其进行 base64 解码。您可以为此使用库,例如​​ jwt-decode 用于 nodejs。

请参阅下面的示例用法(取自 lib 的 README):

var jwtDecode = require('jwt-decode');
var token = 'eyJ0eXAiO.../// jwt token';

var decoded = jwtDecode(token);
console.log(decoded);

/* prints:
 *  foo: "bar",
 *   exp: 1393286893,
 *   iat: 1393268893  
 */

将在您的令牌(此处指 ID 令牌)中的声明取决于您在验证时提供的 scope。例如,如果您使用scope: openid profile email,您将在您的 ID 令牌中返回所有内容。

这里,假设 JWT 是使用库验证的,现在您有了想要阅读的 JWT,如果它来自正文的声明。

【讨论】:

以上是关于如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的Auth0 JWT令牌验证

Angular 2 和 JWT 身份验证 (Auth0)

如何使用 auth0 jwt 识别用户

如何在Redux中使用Auth0 JWT访问API?

Auth0 Laravel 获取 JWT 令牌

如何执行 Auth0 JWT 令牌用户基于角色的授权