节点应用程序之间的共享会话?

我目前有两个单独的节点应用程序运行在两个不同的端口,但共享相同的后端数据存储。 我需要在两个应用程序之间共享用户会话,以便当用户通过一个应用程序login时,他们的会话是可用的,他们似乎login到另一个应用程序。 在这种情况下,它是一个面向公众的网站和pipe理后端。

我们的设置如下:

  • 节点与快递
  • 本地策略正在使用护照处理身份validation
  • 我们使用connect-redis来允许我们通过redis来共享会话。
  • 我们的域名如下所示:www.mydomain.com和adm.mydomain.com

会话内容(和redis)的configuration对于两个应用程序都是相同的:

session: { options: { secret: "my secret", cookie: { domain: "mydomain.com", maxAge:1000*60*60*24 } }, redis: { host: 'my host', maxAge: 86400000, secret: "my secret" } } 

app.js中会话内容的configuration如下所示:

 if ( app.settings.env === "production" ) { session.options.store = new RedisStore(session.redis); } app.use(express.session(session.options)); app.use(passport.initialize()); app.use(passport.session({ secret: 'a different secret' })); 

我期望它做的事 :允许我们在两个应用程序之间的cookie中看到相同的会话ID。

所以我的问题是 :我如何设置快递,redis和护照,以便您可以跨不同的子域共享会话?

       

网上收集的解决方案 "节点应用程序之间的共享会话?"

也许有点过时了,但在这个时候,Express-session可以识别cookie的域选项。 据来源:

 function session(options){ var options = options || {} // name - previously "options.key" , name = options.name || options.key || 'connect.sid' , store = options.store || new MemoryStore , cookie = options.cookie || {} ... 

这是设置cookie:

 var Cookie = module.exports = function Cookie(options) { this.path = '/'; this.maxAge = null; this.httpOnly = true; if (options) merge(this, options); ... 

所以,像这样的东西将适用于当前的1.10.1主:

 secret: "my secret", cookie: { domain: "mydomain.com", 

Express会话似乎并不认可cookie的“域”选项,因此您的问题。 存储会话ID的cookie会自动绑定到每个应用程序的域,因此无法共享。

一种select是编写自己的单点login模块来跨Web应用程序共享会话。 它可能会在执行顺序的早期生活在一个app.use()声明中,并且会简单地创build一个单独的cookie(这将是跨域的),创build一个单独的SSO会话ID,并将SSO ID存储在这个新的cookie中。 之后,您只需根据需要交叉填充req.session和req.sso-session。