【问题标题】:Sharing Redis Sessions Across Node Apps跨节点应用共享 Redis 会话
【发布时间】:2016-12-29 06:29:36
【问题描述】:

我正忙于构建一个包含 3 个不同子域的平台 - example.com、auth.example.com 和 api.example.com。它们与运行在服务器不同端口上的 3 个独立的 NodeJS 应用程序一起运行。

这是设置会话的代码:

var session = require("express-session");
var redisStore = require("connect-redis")(session);
var redisClient = require("redis").createClient(config.redis);

app.use(session({
        secret: config.server.secret,
        store: new redisStore(config.redis),
        client: redisClient,
        resave: false,
        saveUninitialized: false,
        cookie: {
            domain: "example.co.za",
            httpOnly: false
        }
}));

所有 3 个应用程序的配置完全相同,并且它们位于同一台服务器上。由于某种原因,会话没有被共享。我似乎记得几周前它们是共享的,现在事情已经坏了——我有一个偷偷摸摸的怀疑,当我们将所有流量从 HTTP 转移到 HTTPS 时发生了这种情况。这会中断会议吗?我尝试关闭“httpOnly”以防它限制会话,但没有运气。

我已经运行redid-cli MONITOR 并且会话实际上是在登录时保存(Auth App),但没有被其他应用程序检索。当我将 saveUninitialized 设置为 true 时,保存请求来自所有 3 个应用程序 - 这表明它们连接到同一个 Redis 商店。

任何帮助都会很棒。

【问题讨论】:

  • 验证每个客户端存储/发送了哪些cookies,看看有没有区别。还要检查标题(尤其是Set-Cookie),并查看this。对于评论来说,这也可能是一个太大的问题,但是您的身份验证和您的 api 端点是否需要会话?
  • 原来下面的答案解决了我的问题。不过感谢您的帮助。只是为了满足任何好奇心 - 身份验证在登录后创建会话,但随后 api 需要检查是否存在活动会话并在允许访问之前验证内部数据。

标签: node.js session redis


【解决方案1】:

我认为这只是一个 cookie 问题。浏览器不会将会话 cookie 发送回您的子域: 你需要一个领先的 .在域上。例如:

cookie: {
   domain: ".example.co.za",
   httpOnly: false
}

如果这不起作用并且您遇到 AJAX 问题 see this post

【讨论】:

  • 谢谢!出于某种原因,我试过这个,但它最初没有用。后来当我再次尝试时,它只是工作?不管怎样,谢谢你让我再试一次 :) 请注意 - 我不必设置 httpOnly: false,它可以像 true 一样使用 HTTPS。
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2015-12-08
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多