PassportJS – 在Express应用程序中使用多个护照

假设我需要两个不同的护照在一个明确的应用程序(例如用户和房间)。 所以我定义了两个独立的variables:

var passport = require('passport'); var roomPassport = require('passport'); 

然后,我用不同的护照策略初始化它们:

 require('./config/passport')(passport); // pass passport for configuration require('./config/roompassport')(roomPassport); // pass passport for configuration 

最后一步是将其设置为Express中间件:

 // required for passport application.use(session({ secret: 'ilovepassport;-)' })); // session secret application.use(passport.initialize({ userProperty: "user" })); application.use(passport.session()); // persistent login sessions application.use(roomPassport.initialize({ userProperty: "room" })); application.use(roomPassport.session()); // persistent login sessions application.use(flash()); // use connect-flash for flash messages stored in session` 

但是,如果我这样做,实际上roomPassport覆盖护照,而不是有两个对象 – req.user和req.room,我只有一个req.room,但用用户数据初始化。

重要的是要提到,每个护照(用户或房间)可以彼此独立地进行authentication,即存在必须存在两个对象req.userreq.room的场景。

如何解决这个问题?

编辑1

那么,几个小时后,似乎虽然我必须分开护照对象,在application.use(roomPassport.initialize({ userProperty: "room" })); ,事情变得混乱 – 这是因为req.login()方法与最后附加的护照一起工作。 所以不是调用正确的passport.serializeUser方法,而是调用roomPassport.serializeUser方法。

我的下一个问题 – 如何使req.login()调用正确的方法?

您遇到的问题是护照模块在您需要时导出实例化的Passport对象。 而且,由于该对象在需要时由节点caching,因此每次都会得到完全相同的对象。

幸运的是,护照模块还为您提供了课程参考 ,这意味着您可以做到这一点。

 var Passport = require('passport').Passport, passport = new Passport(), roomPassport = new Passport(); 

现在你应该有两个完全分开的护照对象。