我必须通过阻止用户访问其他用户的个人资料来实现我的应用程序的安全性。
route.js
router.get('/currentUser/:username', userAuth, (req, res) => {
User.findOne({
username: req.params.username
}).then(user => {
if (user) {
return res.status(200).json(user);
} else {
return res.status(404).json({
message: 'User not found'
});
}
});
});
和我的userAuth.js
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
jwt.verify(token, 'app_secret_token');
next();
} catch (error) {
res.status(401).json({
message: 'Authentication failed!'
});
}
};
现在,如果我以用户 test 身份登录,那么我的 URL 将是 http://localhost:4200/currentuser/test但如果我将 URL 更改为另一个用户 test2,即使我以 test 身份登录,它也会重定向并加载 test2
如何防止这种情况发生?
最佳答案
您还需要检查登录用户是否访问其数据。
您可以通过根据请求的页面检查 token 中的用户来实现此目的。这意味着您需要在 jwt token 内对用户 ID 进行编码。这也将确保此参数不会受到干扰,因为如果有人尝试在没有 secret 的情况下更改 jwt token ,jwt.verify
将会失败。
您可以在签名时将该数据添加到 jwt token 中:
jwt.sign({
userId: 'username'
}, 'secret', { expiresIn: '1h' });
基本上,如果您保存与serializeUser\deserializeUser结果相同的数据,它也应该有效(用户名只是一个建议)。
您可以使用来自jwt.verify
的回调来获取解码后的 token 并检索该数据
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
jwt.verify(token, 'app_secret_token', (err, decoded) => {
if (err) { throw err; }
const currentUsername = decoded.userId; // <-- this should be whatever data you encoded into the jwt token
// if the user requested is different than the user in the token,
// throw an authentication failure
if (req.originalUrl.includes('/currentUser/') &&
!req.originalUrl.includes(`/currentUser/${currentUsername}`)) {
throw new Error('access to other user data denied');
}
next();
});
} catch (error) {
res.status(401).json({
message: 'Authentication failed!'
});
}
};
尽管我认为这可能是将其分为两个不同的中间件的好例子:-)
PS - 正如 @anand-undavia 提到的,根据 jwt token 本身而不是“url”本身来识别用户请求可能会更好。这样,每个用户应该只能访问自己的数据,并且根本不会出现此问题。
基本上,应该可以使用上述方法(从 token 获取)或从 req.user
字段访问用户(如果您使用任何自动添加用户的中间件)。
关于javascript - 限制用户访问其他用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948641/