仅通过令牌中的userId显示数据

问题描述 投票:0回答:1

我用谷歌搜索:)但是我找不到解决方案来正确地保护端点,问题是当我给用户签名时,我已经获得令牌并且我的userId为1,然后我可以进行GET和POST请求,但是如果我使用route例如:blablabla.com/users/1我可以看到所有数据,而blablabla.com/users/2也可以看到所有数据。如何仅对已签名的ID限制和显示数据,而对于其余ID,则禁止请求]

感谢您的回复

authentication sails.js token endpoint
1个回答
0
投票

您可以使用政策来实现这一目标。首先,您必须创建一个自定义策略。

创建文件api/policies/isAuthorised.js

module.exports = function (req, res, next) {
  let token;
  if (req.headers && req.headers.authorization) {
    const parts = req.headers.authorization.split(' ');
    if (parts.length === 2) {
      const scheme = parts[0];
      const credentials = parts[1];
      if (/^Bearer$/i.test(scheme)) {
        token = credentials;
      }
    } else {
      return res.status(401).json({
        message: 'Format is Authorization: Bearer [token]'
      });
    }
  } else if (req.param('token')) {
    token = req.param('token');

    delete req.query.token;
  } else {
    return res.status(401).json({
      message: 'No authorization header was found'
    });
  }
  // replace it with you own token verfication mechanism
  sails.helpers.jwt.verify(token, (err, decoded) => {
    if (err) {
      return res.status(401).json({
        message: 'Invalid Token!'
      });
    }
    req.token = token;
    User.findOne({
      id: decoded.userid
    }).then((user) => {
      req.currentUser = user;
      next();
    });
  });

};

此策略将确保用户使用有效令牌进行访问。您需要另一个策略来限制仅拥有自己的文档。在文件api/policies/isOwner.js中创建另一个

module.exports = function (req, res, next) {
  try {
    switch (req.options.model) {
      case 'user': {
        User.findOne({
          id: req.param('id')
        }).then(
          (user) => {
            if (!user) {
              return res.status(401).json({
                message: 'Invalid request'
              });
            }
            if ( user.id === req.currentUser.id) {
              next();
            }
            else {
              return res.status(401).json({
                message: 'Invalid request'
              });
            }
          }
        );
        break;
      }
      default: {
        return res.status(401).json({
          message: 'Invalid request'
        });
      }
    }

  } catch (error) {
    return res.status(401).json({
      message: 'Bad Request'
    });
  }
};

现在将这两个策略都应用于您的控制器

config/policies.js

module.exports.policies = {

  '*': false,
  UserController: {
    '*': false, //this will prevent accessing any other api such as delelt update etc.
    'findOne': ['isAuthorised', 'isOwner'],
  },
};
© www.soinside.com 2019 - 2024. All rights reserved.