2016-06-15 56 views
1

假設我有這樣的代碼:如何針對不同路線使用相同的護照策略?

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,那麼處理這類問題的其他可行方法是什麼?

+0

我實際上並不清楚你在問什麼。你是說這兩個API具有不同的用戶集合,並且與其中的用戶完全分離的數據庫? – Paul

回答

6

這個技巧是使用命名的策略語法。基本上,當您撥打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然後將其命名戰略「智威湯遜-2」或者是對你有意義。

+0

非常感謝。這正是我正在尋找的 –

+0

如何爲'passport.serializeUser'和'passport.deserializeUser'做到這一點? – mbacvanski