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

Sails.js route redirect with a custom policy

我想达到的情况:

请求 /register 运行 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 策略中的代码不会被调用。我将如何完成这样的事情?

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

然而,你可以做的是 运行 每次调用 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();
};