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

时间:2014-09-17 17:24:27

标签: node.js express passport.js

假设我在一个快递申请中需要两本不同的护照(例如用户和房间)。 所以我定义了两个独立的变量:

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但是用用户数据初始化。

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

如何解决这个问题?

编辑1

好吧,经过几个小时后,似乎虽然我必须分开护照对象,但是在调用application.use(roomPassport.initialize({ userProperty: "room" }));之后,事情变得混乱了 - 这是因为req.login()方法适用于上次附加的护照。因此,它不是调用正确的passport.serializeUser方法,而是调用roomPassport.serializeUser方法。

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

1 个答案:

答案 0 :(得分:10)

您遇到的问题是护照模块在您需要时导出实例化的Passport对象。并且因为当您需要时,节点会缓存该对象,所以每次都会获得完全相同的对象。

幸运的是,护照模块还为您提供reference to the class,这意味着您可以这样做。

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

现在你应该拥有两个完全独立的护照对象。