服务器重新启动时如何在节点 js 中保持持久会话?
Posted
技术标签:
【中文标题】服务器重新启动时如何在节点 js 中保持持久会话?【英文标题】:how to maintain persistent session in node js when server restarts? 【发布时间】:2016-01-08 10:04:38 【问题描述】:据我研究,到目前为止,*** 的答案是关于在服务器重启后使会话保持不变。
我考虑用 4 种可能的方式来处理我的平均应用程序。
-
cookie-会话https://www.npmjs.com/package/cookie-session
使用 Json Web 令牌 (JWT) https://www.npmjs.com/package/jsonwebtoken
使用 connect-mongo/connect-redis
passport.js
现在我怀疑我是否会在 mongo 和 redis 中重新启动我的服务器。 session 仍然存在,因为它们是外部数据存储。 但是如何使用 JWT 和 cookie 会话使我的会话持久化。 这些会话变量存储在哪里。
对于passport.js,我遇到的解决方案是使会话持久化是将会话数据存储在connect-mongo/connect-redis中。
护照中有没有其他方法可以使会话持久化?
【问题讨论】:
【参考方案1】:如果您将会话存储在外部存储中,则重新启动后它应该可用。
Passport 不对会话负责。您可以独立于通行证设置会话。 Passport 是具有使用会话策略的身份验证中间件。 你设置了快速会话:
app.use(express.session(session options));
然后你初始化并设置护照以使用会话:
app.use(passport.initialize());
app.use(passport.session());
表示不管你是否使用passport,session配置都是一样的。
有几种方法可以使会话持久化: 它们中的大多数将会话存储在数据库或文件系统中(内存存储仅适用于开发环境)。请看这个 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
【讨论】:
感谢您的回答,我也听说过 memcached npmjs.com/package/memcached 我的问题是 memcached 比 redis 快吗?如果是这样,您会建议考虑所有利弊?? 是内存存储。因此它应该更快,但会话数据不是持久的。看看这个答案(它是关于 php 但这种情况类似)***.com/a/13946349/4138339 我编辑帖子并添加此链接:github.com/expressjs/session#compatible-session-stores 有类似问答***.com/questions/33057811/…以上是关于服务器重新启动时如何在节点 js 中保持持久会话?的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS redis 连接会话 ID 在应该保持不变时重新生成