如何对不同的路线使用相同的护照策略?

时间:2016-06-15 22:14:56

标签: javascript node.js passport.js

假设我有这样的代码:

var api1 = require('api1');
var api2 = require('api2');
var app = express();
app.use('/api1', api1);
app.use('/api2', api2);

以下是api1模块的代码:

var router = express.Router();
var options = {
    jwtFromRequest:ExtractJwt.fromAuthHeader(),
    secretOrKey:config.JWTSecret,
    algorithms:['HS256']
}

passport.use(new JwtStrategy(options, function(jwt_payload, verify) {
    //here I look for the user in database No.1
}));
router.post('/files', passport.authenticate('jwt', { session: false}), function(req, res) {
   //...
}
module.exports = router;

这是api2模块的代码:

var router = express.Router();
var options = {
    jwtFromRequest:ExtractJwt.fromAuthHeader(),
    secretOrKey:config.JWTSecret,
    algorithms:['HS256']
}

passport.use(new JwtStrategy(options, function(jwt_payload, verify) {
    //here I look for the user in database No.2
}));
router.post('/files', passport.authenticate('jwt', { session: false}), function(req, res) {
   //...
}
module.exports = router;

这个工作没有用。在这两种情况下,如果我向" / api1 / files"和" / api2 / files"它将在数据库No2中查找用户。如果没有解决这个问题的方法,使用passport.js api,处理这类问题的其他方法是什么?

1 个答案:

答案 0 :(得分:8)

这方面的技巧是使用命名策略语法。基本上,当您致电passport.use()时,您可以传递一个可选的第一个参数,告知护照策略的名称,然后使用authenticate调用该名称(而不是默认名称)。因此,在您的情况下,您可以执行以下操作:

passport.use('jwt-1', new JwtStrategy(options, function(jwt_payload, verify) {
    //here I look for the user in database No.1
}));

router.post('/files', passport.authenticate('jwt-1', { session: false}), function(req, res) {
   //...
}

您的api2会将其策略命名为“jwt-2'或者对你有意义的事情。