【发布时间】: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 需要检查是否存在活动会话并在允许访问之前验证内部数据。