跨多个节点实例保存会话数据

Saving session data across multiple node instances

编辑 - 2017 年 10 月 22 日
我们的会话没有持续存在的原因不止一个,我不得不将我们的
快速会话选项更改为:

api.use(session({
    secret: 'verysecretsecret',
    resave: false,
    saveUninitialized: false,
    cookie: {
        path: '/',
        httpOnly: true,
        domain: 'domain.dev',
        maxAge: 1000 * 60 * 24
    },
    store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
}));

显然 domain: 'localhost' 每次有人启动会话时 express-session 都会启动一个新会话,然后 refreshes/navigates 当您有一个单独的节点实例用于会话处理时离开和返回。

我通过执行以下操作解决了这个问题:

  1. 添加 127.0.0.1 domain.dev 到我的 hosts 文件,位于 C:\Windows\System32\drivers\etc.
  2. 根据下面给出的答案,我需要一个存储会话的地方,所以我们选择了 MongoDB。这意味着我必须将以下内容添加到我的快速会话选项中:

    store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })

  3. 在快速会话选项中添加了 httpOnly: true 属性。
  4. 因为我们对 ajax 请求使用 jQuery,所以我必须在调用后端之前在前端 Web 应用程序中启用一些设置:

    $.ajaxSetup({ xhrFields: { withCredentials: true }, crossDomain: true, });


原创POST
我目前正在开发一个平台,该平台决定在端口 3001 上设置 API 运行,而 Web 应用程序本身在端口 3000 上设置 运行。做出此决定是为了进行监控交通更方便。

现在,我们正在谈论快速应用程序,所以我们默认使用 express-session npm 包。我想知道是否有可能保存存储在端口 3001 上的节点实例 运行 上的会话数据,如果有意义的话,由端口 3000 上的节点实例 运行 检索。

详细来说,这是我们的用户认证流程:

  1. 用户在端口 3000 上导航到我们的 Web 应用 运行。
  2. 用户然后登录,向端口 3001 上的 API 运行 发送 POST 请求,当凭证正确时存储会话数据,发送响应以便网络应用知道用户已通过身份验证。
  3. 用户在关闭浏览器后刷新页面或返回到 Web 应用程序,因此 Web 应用程序失去了经过身份验证的状态。因此在加载时它总是向端口 3001 上的 API 发送 GET 请求以检查是否有可用的会话数据,这意味着用户已登录,因此我们可以让 Web 应用程序知道用户已通过身份验证。

(如果我的思路在这里有问题,请告诉我)

问题是执行此操作时 express-session 似乎不起作用。 我启用了 CORS,因此 Web 应用程序能够将请求发送到 API。这就是快速会话配置的样子:

api.use(session({
    secret: 'verysecretsecret',
    resave: false,
    saveUninitialized: false,
    cookie: {
        path: '/',
        domain: 'localhost',
        maxAge: 1000 * 60 * 24
    }
}));

最好在不使用Redis之类的情况下帮助我解决这个问题,我只是想知道仅使用express-session和node是否可以解决这个问题。

Preferably help me solve this problem without using something like Redis

您希望我们最好在不使用正确工具的情况下帮助您解决这个问题。

如果没有 Redis,您将需要使用其他一些数据库。如果没有 "something like Redis"(即没有数据库),您将需要实现一些其他方法来处理一些书籍示例用例中的数据库。

如果您要使用数据库,那么对于需要在几乎每个请求上快速访问数据的事情,使用像 Redis 或 Memcached 这样的数据库是最合理的。如果您使用比这更慢的数据库,您的应用程序的性能将受到极大的影响。

I'd simply like to know if solving this problem is possible using just express-session and node.

是的。特别是当您将 express-session 与 Redis 一起使用时,正如 express-session 模块的文档中所建议的那样:

如果您的所有实例都在同一台机器上工作,那么您可以使用像 SQLite 这样的数据库将数据存储在文件系统中,但即使您的所有实例都在同一个机器上,我的建议还是仍然使用 Redis,因为它更简单,性能更高,并且在需要横向扩展的情况下也很容易做到。

此外,如果您的所有会话数据都可以毫无问题地放入 cookie,那么您可以使用此模块:

这会将所有会话数据存储在 cookie 中。 (感谢 Robert Klep 在评论中指出。)