如何configuration多个会话的快递和护照

我需要实现一个HTTP服务器,支持与护照分开的会话处理。 原因是我需要身份validation2个实体:我的客户(客户)和他们的客户(用户),我的想法是使用自己的安全“空间”:自己的会话中间件,不同的会话属性,自己的通行证实例。

它工作正常,如果我只是使用会话存储的帐户,但不是这个代码的用户:

const express = require('express') const session = require('express-session') const Passport = require('passport').Passport const userPassport = new Passport() const accountPassport = new Passport() // add passport strategies const app = express() app.use(session({ secret: config.session.secret, //store: accountSessionStore, resave: true, saveUninitialized: true, })) app.use(accountPassport.initialize({ userProperty: 'account' })) app.use(accountPassport.session()) app.use(userPassport.initialize({ userProperty: 'user' })) 

一旦我添加这行app.use(userPassport.session())在最后它打破了:账户的loginstream不再工作。 看来,快递会话中间件不能处理多个护照实例,最后一次调用覆盖实例。

将帐户和客户包装到自己的实例中,如下所示:

 const app1 = express() // register stuff for accounts const app2 = express() // register stuff for users const rootApp = express() rootApp.use(app1) rootApp.use(app2) 

没有工作,并使用自己的HTTP服务器(和一个额外的端口)似乎有点矫枉过正。

我认为护照附加了它的实例来初始化请求,因此你观察这种行为是有道理的。

我有类似的任务,我通过创build两个Passport和两个路由器(express.js 4.x)来解决它。

然后,您可以分别configuration每个会话,并将不同的护照附加到不同的路由。

在咖啡脚本中的例子,希望能给你一个线索:

 # # Apps # app = express() adminApp = express() # # Routers # apiRouter = express.Router() adminRouter = express.Router() # # Authentication # apiPassport = new Passport() adminPassport = new Passport() # # Add API auth strategies # apiPassport.use new AnonymousStrategy() adminPassport.use new new TwitterStrategy # ... adminPassport.serializeUser (user, done) -> done null, user.id return adminPassport.deserializeUser (id, done) -> done null, id: id return # # Configure session # app.use '/api/v1/auth*', session({ name: 'sid', saveUninitialized: false, resave: false, secret: process.env.SESSION_SECRET || 'keyboard cat', store: new MongoStore(mongooseConnection: mongoose.connection) }) adminApp.use session({ name: 'admin.sid', saveUninitialized: false, resave: false, secret: process.env.SESSION_SECRET || 'keyboard cat', store: new MongoStore(mongooseConnection: mongoose.connection) }) # # Configure passport middleware # app.use '/api*', apiPassport.initialize() app.use '/api*', apiPassport.session() adminApp.use adminPassport.initialize() adminApp.use adminPassport.session() # # Mount apps and routers # adminApp.use adminRouter app.use '/api/v1/', apiRouter app.use '/admin/', adminApp