2014-09-24 67 views
2

护照很棒。我现在发现我在处理会话方面遇到了一些问题。 我一定是用错了。节点+ Passport.js +会话+多个服务器

所有适合我的登录+会话+用户数据存储在我的数据库中。 但是我发现,当我转移到生产环境(多个服务器的EC2上的云)时,每次都会丢失登录会话。 这对我来说很清楚 - 可能会发生,因为会话对于每个服务器都是唯一的。

所以我的问题是 - 我怎么解决这个问题.. 我想我需要存储我自己对用户的浏览器的cookie?

这是否意味着我无法使用express.session?

感谢, 宜兰

回答

1

您需要存储在一个“全球性”区域会话数据,这是对所有服务器进行访问。这可能是redis或其他数据库。

以MEAN.JS为例。在这里,他们使用express-session与MongoDB存储容器(因为它们是MEAN堆栈;),通过connect-mongo。他们的项目非常容易设置,如果仅仅是一个例子。

代码,同时建立明确的是这样的:

//top of file 
var session = require('express-session') 
    mongoStore = require('connect-mongo')({ 
     session: session 
    }); 

//...later in setup 

// Express MongoDB session storage 
app.use(session({ 
    saveUninitialized: true, 
    resave: true, 
    secret: config.sessionSecret, 
    store: new mongoStore({ 
     db: db.connection.db, 
     collection: config.sessionCollection 
    }) 
})); 

// use passport session 
app.use(passport.initialize()); 
app.use(passport.session()); 
+0

我的后端有一个数据库(dynamodb),但这是否意味着每个页面视图都有一个数据库调用?这对我来说似乎有点过分。我记得我读过某处(实际上首先是我通过护照会话工作的),实际上你可以将整个会话数据分类,加密并保存到一个cookie中,并因此无需登录数据的后端存储。 – 2014-09-25 20:09:31

+0

有很多方法来处理这样的事情。请注意,您仅存储在客户端上的任何内容都比服务器端更加暴露。是的,这是针对需要会话身份验证的每个操作的数据库调用。在大多数情况下,使用像Redis或Memcache这样的“内存中”数据库(可在AWS上获得价格)的速度比Dynamo或Mongo更快。要在服务器之间共享会话,您需要在某处可访问的数据;我给出的例子只是一个可供您随时访问的例子。 – clay 2014-09-26 13:30:39

7

OK, 所以基本上我一直在寻找(不知道这将是其他人同样的答案)是存储会话数据的方法负载均衡实例之间没有为每个页面视图进行数据库调用,这对我来说似乎过分了,因为我只需要让用户登录到Google/FB。

看来,我一直在寻找的答案是Cookie的会话中间件 https://github.com/expressjs/cookie-session

这需要更换其使用MemoryStore的默认express.session机制。 BTW MemoryStore本身在运行时会给你一个警告,它不会通过单个进程扩展,还可能导致内存泄漏。

如果我理解正确的话,会将会话数据本身序列化为会话cookie(加密),而不是在会话cookie中使用会话ID。 这对我来说似乎很完美。很明显,如果你有很多会话数据,我不会期望它能够工作,因为cookie的大小是有限的。就我而言,我只需要名称,ID和头像网址,所以我认为这就足够了。 感谢所有帮助过我的人。