通过 express req 参数传递解码的 jwt 数据是个好主意吗?

Posted

技术标签:

【中文标题】通过 express req 参数传递解码的 jwt 数据是个好主意吗?【英文标题】:Is a good idea pass decoded jwt data via express req parameters? 【发布时间】:2021-08-21 00:08:01 【问题描述】:

在我的 NodeJs 应用程序中,我使用 jwt 来管理用户会话,在 jwt 令牌内我存储 user_role 和 user_id。这是我的路线:

 routes.post('/manga/post', Authorize("Scan"), MangaMiddleware.valid_manga_store, MangaController.store);

在中间件 Authorize("Scan") 中,我使用“jwt.verify”验证 jwt 令牌,如果其有效,我将检查是否有具有令牌 ID 的活动用户以及他的权限是否允许他访问此路线,如果是这样,我使用 next()

在 MangaController.store 中我要保存一个新漫画,我需要在文档中保存发出请求的 user_id。

这就是我的意思,我已经在授权中间件中解码了令牌,但解码后的数据不会保留在中间件之外。要从 MangaController 访问 user_id,我必须再次验证令牌。

我认为我应该避免两次验证相同的令牌,因此在验证后的中间件授权中,我将 user_id(加密)保存在 req.auth 中,并在控制器中使用它之后,我设置了 req.auth = null。这样 user_id 会在 req.auth 中存储一小段时间。

req.auth = user_id //after encrypting

我的朋友告诉我,将解码后的数据存储在 req 参数中是个坏主意,但我不认为这很糟糕。

简而言之。 我需要验证令牌两次吗?还有其他方法可以检索此数据吗?在 req 参数中存储解码数据是不是很糟糕?非常感谢您的时间和帮助。

【问题讨论】:

【参考方案1】:

验证和解码 JWT 是两件不同的事情。当您验证时,它会检查其完整性,即确保它没有被篡改,而解码 JWT 意味着从 base64 转换为可读格式(UTF-8?)。所以不需要验证两次。

假设您在标头中以"token":"base64encodedJwt" 发送令牌,然后在成功验证后,只要您需要 user_id,您就可以简单地解码 JWT。使用一些 JWT 解码库。

    let token = req.get('token') || req.headers['token'];
    let payload = decodeJWT(token);
    let userId = payload.user_id;

如果您没有将其存储在req 对象中,那么您必须在每次需要时对其进行解码。所以req.auth = userId 应该没问题。

【讨论】:

以上是关于通过 express req 参数传递解码的 jwt 数据是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Express—get传递参数

express表单提交和参数接收4种方式

express中 获取参数的几种形式

express-jwt 将用户对象设置为 req.user._doc 而不仅仅是 req.user?

Express

在express中的root之后使用可选参数传递路由控制?