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

时间:2016-10-06 10:08:37

标签: node.js express passport.js

我需要实现一个HTTP服务器,它支持使用护照进行单独的会话处理。原因是我需要对2个实体进行身份验证:我的客户(帐户)和他们的客户(用户),我的想法是使用自己的安全"空间"为此:自己的会话中间件,不同的会话属性,自己的护照实例。

如果我只是为会计商店使用会话商店而不是使用此代码的用户,则工作正常:

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())就会中断:帐户的登录流程不再有效。快递会话中间件似乎无法处理多个护照实例,最后一次调用正在覆盖该实例。

将帐户和客户包装到这样的自己的实例中:

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

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

1 个答案:

答案 0 :(得分:3)

我认为护照会将其实例附加到初始化时请求,因此您可以观察到这种行为。

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

然后,您可以单独配置每个会话,并将不同的护照附加到不同的路径。

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

#
# 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