javascript - 安全性(JWT NodeJS)的大问题,所有访问权限的一个令牌
问题描述
我的 Web 应用程序的安全性确实存在很大问题。当用户登录到我的应用程序时,我实现了 JWT 令牌(REST API 返回令牌)。
在我的 jwt 令牌中,我只有用户 ID。问题是,当我想登录 ID = 1 的用户时,
我可以使用相同的令牌查看并执行所有其他用户的休息操作。例如:
当我查看 userId = 1 时,我执行 GET 操作:/api/users/1 并且我有关于用户 1 的信息。但我可以执行操作 /api/users/2、3 等。
一个令牌。如何保护它?
const jwt = require('jsonwebtoken');
const env = require('../config/env.config.js');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
const decoded = jwt.verify(token, env.SECRET_KEY);
req.userData = decoded;
next();
} catch (error) {
return res.status(401).json({
message: 'Auth failed',
});
}
};
解决方案
我认为最好的解决方案是创建中间件来检查发件人的 id 并将其附加到路由,类似于下面
const middleware = (req, res, next) => {
const id = req.params.id || req.body.id || req.query.id
if (req.userData.id === id) {
next()
} else {
res.status(403).send({message: "forbidden"})
}
}
router.get("/api/users/:id", middleware, (req, res) => {
// do your staff
res.send({message: "ok"})
})
router.put("/api/users/:id", middleware, (req, res) => {
// do your staff
res.send({message: "ok"})
})
推荐阅读
- python - 我可以将 Python 的安装目录移动到任何地方(是否可移植)?
- sqlite.swift - 寻找 sqlite.swift 示例项目
- mongodb - 我如何能够根据数组长度进行查询?
- python - python函数将数据转换为JSON
- bot-framework-composer - Microsoft Bot Framework Composer Teams 包发送任务模块
- c - 如何修复 munmap_chunk():在 C 中调用 fclose 并覆盖堆栈变量时指针无效?
- database - 为我的用例选择数据库时遇到问题。有任何帮助/见解会受到重视吗?
- javascript - css中的onclick背景颜色转换
- ffmpeg - 是否可以像使用 FFmpeg 的 Icecast 一样通过 http 投射 mp3?
- r - 如何从数据框中获取特定年份的前 2 个值?