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

假设我有这样的代码:

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; 

这没有用。 在这两种情况下,如果我将POST发送到“/ api1 / files”和“/ api2 / files”,它将在数据库No2中查找用户。 如果没有解决这个问题的办法,使用passport.js api,还有哪些其他可行的方法来处理这类问题?

这个技巧是使用命名的策略语法。 基本上,当你调用passport.use()你可以传递一个可选的第一个param来告诉passport这个策略的名字,然后在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会命名它的策略“j​​wt-2”或者其他任何对你有意义的东西。