服务器重启时如何在节点js中维护持久会话?

时间:2015-10-10 15:13:37

标签: node.js session express redis passport.js

到目前为止,我研究了stackoverflow关于在服务器重启后使会话持久化的答案。

我考虑使用我的平均应用程序有4种可能的方法。

  1. Cookie-Sessions https://www.npmjs.com/package/cookie-session
  2. 使用Json网络令牌(JWT)https://www.npmjs.com/package/jsonwebtoken
  3. 使用connect-mongo / connect-redis
  4. passport.js
  5. 现在我怀疑是否会在mongo和redis中重启我的服务器。会话仍然在那里,因为它们是外部数据存储。 但是如何使用JWT和cookie会话使我的会话持久化。 这些会话变量存储在哪里。

    在passport.js的情况下,我遇到的解决方案是使会话持久化是将会话数据存储在connect-mongo / connect-redis中。

    护照中还有其他方法可以使会话持久吗?

1 个答案:

答案 0 :(得分:7)

如果您将会话存储在外部存储中,则重新启动后应该可用。

Passport不对会话负责。您可以在快递中独立设置会话。 Passport是身份验证中间件,具有使用会话的策略。 你设置快递会议:

app.use(express.session(session options));

之后,您启动并设置护照以使用会话:

app.use(passport.initialize());
app.use(passport.session());

这意味着无论您是否使用护照,会话配置都是相同的。

使会话持久化的方法很少: 其中大多数将会话存储在db或文件系统中(内存存储仅适用于dev env)。请查看此npm搜索列表link

官方快递会话页面https://github.com/expressjs/session#compatible-session-stores

中的兼容会话商店列表

如果正确实施,Jwt令牌是无国籍的。这意味着您的服务器不存储任何会话数据,它不知道有多少会话有效。如果它有有效的jwt令牌,它会授权请求。

Jwt令牌可以存储一些数据,例如您的用户ID。当您的服务器接收令牌时,它会解码并验证,然后您可以访问此令牌中的数据。请阅读这篇文章了解更多详情:

https://stormpath.com/blog/jwt-the-right-way/

最重要的部分(有更重要的事情,但有时会被遗忘):

  

在您信任JWT中的任何信息之前,请始终验证签名

  

不要在JWT中包含任何敏感数据

请查看此模块以维护jwt:

https://www.npmjs.com/package/json-web-token

甚至是某些混合解决方案模块(使用jwt令牌的redis会话):

https://www.npmjs.com/package/jwt-redis-session