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

时间:2012-11-29 01:37:48

标签: node.js express redis session-state

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

我们的设置如下:

  • 带快递的节点
  • 护照正用于使用本地策略处理身份验证
  • 我们使用connect-redis允许我们通过redis分享会话。
  • 我们的域名如下:www.mydomain.com和adm.mydomain.com

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

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中会话内容的配置如下所示:

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。

所以我的问题是:如何设置express,redis和passport,以便您可以在不同的子域之间共享会话?

2 个答案:

答案 0 :(得分:4)

可能有点过时,但此时,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 master:

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

答案 1 :(得分:2)

快速会话似乎无法识别"域" cookie的选项因此你的问题。存储会话ID的cookie会自动绑定到每个应用的域名,因此无法共享。

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