【问题标题】:Node+Passport.js + Sessions + multiple serversNode+Passport.js + Sessions + 多台服务器
【发布时间】:2014-11-19 11:43:21
【问题描述】:

护照很棒。我现在发现它处理会话的方式存在一些问题。 我一定是用错了。

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

所以我的问题是 - 我该如何解决这个问题.. 我想我需要在用户的浏览器上存储我自己的 cookie?

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

谢谢, 宜兰

【问题讨论】:

    标签: node.js session cloud multiple-instances passport.js


    【解决方案1】:

    您需要将会话数据存储在所有服务器都可以访问的“全局”区域。这可能是redis 或其他数据库。

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

    设置express时的代码是这样的:

    //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() );
    

    【讨论】:

    • 我的后端确实有一个数据库 (dynamodb),但这是否意味着每个页面视图都有一个数据库调用?这对我来说似乎有点过分了。我记得我在某处读到(实际上起初我认为护照会话是这样工作的),您实际上可以对整个会话数据进行序列化、加密并将其保存到 cookie 中,从而消除对登录数据后端存储的需求。
    • 有很多方法可以处理这样的事情。请注意,您仅在客户端存储的任何内容都比服务器端更暴露。是的,这是需要会话身份验证的每个操作的数据库调用。在大多数情况下,使用 Redis 或 Memcache 之类的“内存中”数据库(在 AWS 上以一定价格提供)会比 Dynamo 或 Mongo 更快。要在服务器之间共享会话,您需要在某个地方访问该数据;我给出的示例只是您可以轻松访问的示例。
    【解决方案2】:

    好的, 所以基本上我一直在寻找的东西(不确定对其他人来说是否会是相同的答案)是一种在负载平衡实例之间存储会话数据而不为每个页面视图进行数据库调用的方法,这对我来说似乎太过分了,因为我只需要保持用户登录到 Google/FB。

    看来我正在寻找的答案是 cookie-session 中间件 https://github.com/expressjs/cookie-session

    这需要替换使用 MemoryStore 的默认 express.session 机制。顺便说一句,MemoryStore 本身在运行时会向您发出警告,它不会扩展到单个进程,并且可能会导致内存泄漏。

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

    【讨论】:

    • express-session v1.5.0 起,该模块不再需要使用 cookie-parser 中间件来工作。该模块现在直接在 req/res 上读取和写入 cookie。如果此模块和 cookie-parser 之间的 secret 不同,使用 cookie-parser 可能会导致问题。
    猜你喜欢
    • 2023-04-08
    • 2014-04-20
    • 2018-07-24
    • 2014-10-15
    • 2016-03-12
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多