假设我在一个快递申请中需要两本不同的护照(例如用户和房间)。 所以我定义了两个独立的变量:
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.user
和req.room
都必须存在的情况。
如何解决这个问题?
编辑1
好吧,经过几个小时后,似乎虽然我必须分开护照对象,但是在调用application.use(roomPassport.initialize({ userProperty: "room" }));
之后,事情变得混乱了 - 这是因为req.login()
方法适用于上次附加的护照。因此,它不是调用正确的passport.serializeUser
方法,而是调用roomPassport.serializeUser
方法。
我的下一个问题 - 如何让req.login()
调用正确的方法?
答案 0 :(得分:10)
您遇到的问题是护照模块在您需要时导出实例化的Passport对象。并且因为当您需要时,节点会缓存该对象,所以每次都会获得完全相同的对象。
幸运的是,护照模块还为您提供reference to the class,这意味着您可以这样做。
var Passport = require('passport').Passport,
passport = new Passport(),
roomPassport = new Passport();
现在你应该拥有两个完全独立的护照对象。