跨节点应用共享Redis会话

问题描述:

我忙于构建一个包含3个不同子域的平台 - example.com,auth.example.com和api.example.com。它们运行在服务器的不同端口上运行的3个独立的NodeJS应用程序。跨节点应用共享Redis会话

这里是代码建立会话:

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和会话,事实上,被保存在登录(验证应用程序),但没有被其他应用程序检索。当我将saveUninitialized设置为true时,保存请求来自所有3个应用程序 - 这表明它们已连接到相同的Redis Store。

任何帮助将是伟大的。

+0

验证被存储什么饼干/每个客户端发送,看看是否有任何区别。另外,还要检查的头文件(特别是'SET-Cookie'),并看看[这里](http://stackoverflow.com/questions/7834228/set-cookie-for-domain-instead-of-subdomain-using-的NodeJS和-expressjs)。这也可能是一个太大的评论问题,但是你的认证和你的api端点需要会话有什么原因吗? – dvlsg

+0

原来,下面的答案解决了我的问题。感谢您的帮助。只是为了满足好奇心任何 - 身份验证是创造登录后的会话,但随后的API需要检查,有一个会话的有效和允许访问之前验证里面的数据。 – nickcorin

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

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

如果不工作,你有AJAX发出see this post

+0

谢谢!出于某种原因,我曾尝试过这种方法,但最初并不奏效。后来当我再次尝试时,它刚刚工作?无论哪种方式,感谢让我试试吧:)再次 刚一说明 - 我没有设置'仅Http:FALSE',它的工作细如'使用HTTPS TRUE'。 – nickcorin