【问题标题】:Shared Sessions between Node Apps?节点应用程序之间的共享会话?
【发布时间】:2012-11-17 00:51:50
【问题描述】:

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

我们的设置如下:

  • 带快递的节点
  • passport 被用于通过本地策略处理身份验证
  • 我们使用 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,以便您可以在不同的子域之间共享会话?

【问题讨论】:

  • 我认为您可能需要将 cookie 域指定为 ".mydomain.com" -- 请注意前导 .
  • 没有“”?我们昨天在测试中使用了“.mydomain.com”,但这似乎不起作用。今天早上我会试一试,看看结果如何。
  • 你输入了*,对吧?在那种情况下,是的,只是前导点。我认为这就是使 cookie 可以从不同的子域读取的原因。让我知道,我可以提供它作为答案。
  • 所以使用“.mydomain.com”实际上也不起作用。我们仍在寻找……不过,感谢 Linus 的意见。
  • 你有没有让这个工作?有可能吗?

标签: node.js express redis session-state


【解决方案1】:

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

【讨论】:

  • 感谢您的提醒。我不再参与这个项目,也不再在 Node 中工作了,对了喵喵,但这是个好消息。
【解决方案2】:

Express-session 似乎无法识别 cookie 的“域”选项,因此是您的问题。存储会话 ID 的 cookie 会自动绑定到每个应用的域,因此无法共享。

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

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2013-02-15
    • 2014-09-30
    • 2023-03-27
    相关资源
    最近更新 更多