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

Ang*_*rov 7 node.js express passport.js

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

var passport    = require('passport');
var roomPassport = require('passport');
Run Code Online (Sandbox Code Playgroud)

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

require('./config/passport')(passport); // pass passport for configuration
require('./config/roompassport')(roomPassport); // pass passport for configuration
Run Code Online (Sandbox Code Playgroud)

最后一步是将它们设置为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`
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,实际上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()调用正确的方法?

nic*_*law 11

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

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

var Passport = require('passport').Passport,
    passport = new Passport(),
    roomPassport = new Passport();
Run Code Online (Sandbox Code Playgroud)

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