Sails.js使用自定义策略路由重定向

时间:2015-03-06 15:02:09

标签: node.js sails.js middleware

我想要实现的情况:

请求/注册运行AuthController.register

请求/ facebook运行AuthController.register,但之前应用了facebook政策。

我已在

中创建了一项政策
/api/policies/facebook.js
像这样

var graph = require('fbgraph');

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

    facebook_token = req.query.facebook_token;
    if(!facebook_token){
        res.send('401',{error:"Missing facebook token"});
    }
    graph.setAccessToken(facebook_token);
    graph.get("me",function(err,graph_res){
      if(err){
        res.send('401',{error:"Facebook authentication error"});
        return;
      }
      else{
        next();      
      }
    });  
};

中设置策略
/config/policies.js
像这样

module.exports.policies = {
   'auth': {
     'facebook': ['facebook']
   }
}

我设置了这样的路线

module.exports.routes = {
   'post /register': 'AuthController.register',
   'post /facebook': 'AuthController.register',
};

现在,facebook政策中的代码无法被调用。我将如何完成这样的事情?

1 个答案:

答案 0 :(得分:1)

我不确定政策是否可以按照您的预期方式运作。在您当前的/config/policies.js中,只要调用AuthController操作facebook.js,您就会告诉Sails运行facebook策略。由于您没有在控制器中定义此类操作,因此策略永远不会运行。对于策略,请求来自哪个方式并不重要,重要的是请求尝试访问哪个控制器操作。

但是,您可以执行的是在每次调用AuthController.register时运行策略,并在策略文件中添加一行以检查请求是否来自/facebook

/config/policies.js:

module.exports.policies = {
    auth': {
    'register': ['facebook']
    }
}

/api/policies/facebook.js:

module.exports = function(req, res, next) {
    if (req.route.path === '/facebook') {
        facebook_token = req.query.facebook_token;
        if(!facebook_token){
            res.send('401',{error:"Missing facebook token"});
        }
        graph.setAccessToken(facebook_token);
        graph.get("me",function(err,graph_res){
          if(err){
            res.send('401',{error:"Facebook authentication error"});
            return;
          }
          else{
            next();      
          }
        });
    }
    else return next();
};