javascript - 限制用户访问其他用户配置文件

标签 javascript node.js express

我必须通过阻止用户访问其他用户的个人资料来实现我的应用程序的安全性。

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/

相关文章:

node.js - 我的 EC2 实例中的 IP 地址解析是否错误?

javascript - 为 VSCode/Monaco Intellisense 添加 JavaScript 类型提示

javascript - 选择地点的传单

javascript - 将字符串转换为数字但使用 JavaScript 保留 '+'

node.js - 立即在 Mac 上的 CLI 中注册击键

node.js - 使用 Strong-Soap 通过 Node 进行简单 SOAP 调用

node.js - node express res.redirect 没有哈希

node.js - "Invalid csrf token"在nodejs(Express)中使用CSURF。CSRF token 对于第一个请求工作正常,但对于所有其他请求给出错误

javascript - 如何访问主体设置为原始数据的 postman 请求的 req.body.title

javascript - 在 Node.js Express 服务器 : res. render(file.ejs, data) 中处理 GET 请求由于未定义数据而无法工作