Sails JS政策未响应

时间:2018-07-09 18:41:48

标签: sails.js jwt

我遇到了我制定的Sails Js政策问题。它应该充当任何已发送请求和目标控制器之间的中间件。

期望

应该验证在请求的标头中发送的JWT,解码播放量,并将其内容分配给可从任何控制器访问的req.user变量。

问题

当我发送带有先前生成的JWT(带有邮递员的)的Barear Token授权类型请求时,我没有从后端服务器收到任何答案(甚至没有500)。

我构建的东西

登录策略:

module.exports = async function (req, res, next) {

  var token;

  // Check if authorization header is present
  if(req.headers && req.headers.authorization) {

    // If so, isolate each parts
    var parts = req.headers.authorization.split(' ');
    if(parts.length == 2) {
        var scheme = parts[0];
        var credentials = parts[1];

        if(/^Bearer$/i.test(scheme)) {
            token = credentials;
        }
    } else {... error return ...}

    // If all test succeed, use TokenService.verify
    var decoded = TokenService.verify(token);

    User.findOne({id: decoded.id}).exec((error, user) => {
      if (error) return res.serverError(error)
      if (user) {
        req.token = decoded;
        next();
      }
    });
};

我的令牌服务:

const jwt = require('jsonwebtoken');
const tokenSecret = 'secretissecret';

module.exports = {

[...]

verify: token => jwt.verify(token, tokenSecret)
};

策略配置:

module.exports.policies = {

'*': 'is-logged-in',

// Bypass the `is-logged-in` policy for:
'entrance/*': true,
'account/logout': true,
'deliver-contact-form-message': true,

};

最简单的目标控制器

module.exports = {

[Actions 2 description, no-inputs, exits]

 fn: async function (inputs, exits) {

   // Look up by the user.id
   var userRecord = await User.findOne({ id: this.req.token.id}) <== Fix here

   // If there was no matching user, respond thru the "unfound" exit.
   if(!userRecord) {
     throw 'unfound';
   }    

   return exits.success({
     user: userRecord
   });
  }
};

2 个答案:

答案 0 :(得分:0)

您还需要在config / policies.js中注册策略

sails网络应用程序模板中的示例:

module.exports.policies = {

    '*': 'is-logged-in',

  // Bypass the `is-logged-in` policy for:
  'entrance/*': true,
  'account/logout': true,
  'view-homepage-or-redirect': true,
  'deliver-contact-form-message': true,

};

答案 1 :(得分:0)

我以这种方式解决了问题。

要访问Actions2中的请求token对象,我使用了this.req.token