通过 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 数据是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章