如何在 Node.js 中实现持久化会话(session)以便服务器重启后仍能保持?

11

就我从stackoverflow的答案中所学到的关于在服务器重启后使会话持久化的技术方面,有四种可能的方法可以用于我的mean应用:

  1. cookie-Sessions https://www.npmjs.com/package/cookie-session
  2. 使用Json web tokens (JWT) https://www.npmjs.com/package/jsonwebtoken
  3. 使用connect-mongo/connect-redis
  4. passport.js

现在我的疑问是,如果我重启mongo和redis服务器,会话是否仍然存在,因为它们是外部数据存储。 但如何使用JWT和cookie sessions使我的会话持久化?这些会话变量存储在哪里。

对于passport.js,我发现的解决方案是将会话数据存储在connect-mongo/connect-redis中以使会话持久化。

除了使用passport.js之外,还有其他方法可以使会话持久化吗?

1个回答

8
如果您将会话存储在外部存储中,则在重新启动后应该可以使用。
Passport不负责会话。您需要在express中独立设置会话,Passport是身份验证中间件,具有使用您的会话的策略。 您可以设置express会话:
app.use(express.session(session options));

接着,您需要初始化并设置护照以使用会话:

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

这意味着无论您使用护照与否,会话配置都将保持不变。

有几种方法可以使会话持久: 其中大多数将会话存储在数据库或文件系统中(内存存储仅适用于开发环境)。请查看此npm搜索列表 link

兼容的会话存储列表,请参阅官方express-session页面 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


谢谢你的回答,我也听说过Memcached https://www.npmjs.com/package/memcached 我想问的是,Memcached是否比Redis更快?如果是,考虑到所有的优缺点,你会建议使用哪个? - romir
这是内存存储。因此,它应该更快,但会话数据不是持久的。看看这个答案(它是关于PHP的,但这种情况类似)https://dev59.com/qmYr5IYBdhLWcg3wG2pJ#13946349 - Krzysztof Sztompka
我编辑了帖子并添加了这个链接:https://github.com/expressjs/session#compatible-session-stores - Krzysztof Sztompka
这里有类似的问题和回答:http://stackoverflow.com/questions/33057811/memcache-v-s-redis-for-maintaining-persistent-sessions - Krzysztof Sztompka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接