无法让`cookieSession`与`maxAge`一起工作

时间:2015-05-07 18:48:50

标签: node.js express connect passport.js

**已解决**

我一直在努力解决这个问题。那里有很多类似的帖子,但没有提出的解决方案对我有用。

我正在使用带有cookie会话的Express和Passport。当我将update completed at hh:mm:ss传递给cookieSession时,一切正常:

secret

但默认cookie是基于会话的,因此当您关闭浏览器时它会清除。我需要一个有时间限制的cookie。所以我尝试使用所谓的支持选项:

app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession('MySecret'));
app.use(passport.initialize());
app.use(passport.session());

它停止工作。看起来cookie在我的浏览器中设置并且看起来不错,但没有app.use(express.cookieParser('MySecret')); app.use(express.cookieSession({ secret: 'MySecret', cookie: { maxAge: 365 * 24 * 60 * 60 * 1000 } })); app.use(passport.initialize()); app.use(passport.session()); ,后续请求未经过身份验证。

我尝试使用req.user代替maxage无效。我可以切换到相同的配置,但是使用maxAge而不是express.session()并且 可以正常工作,但是当服务器重新启动时会话会丢失。

任何帮助?

编辑:我正在使用Express 3.20.2 btw

1 个答案:

答案 0 :(得分:1)

这是用户错误。我不知道我在哪里获得了将#map-canvas { width: 100%; height: 280px; background-color: #CCC } .image-formatting { max-width: 100%; height: auto; opacity: 0.5; z-index: -1; position: absolute; margin-left: 65%; } 作为字符串传递给secret的语法,但这是无效的。它会被忽略,实际上会回到使用由cookieSession()调用首先定义的req.secret

这就是它使用原始代码的原因。我仍然认为这是一个wtf时刻,因为第二种语法应该仍然有效,但事实并非如此。它归结为cookieParser('MySecret')模块中的这个片段:

cookieSession

因此当您 if (!options.secret && req.secret) { req.session = req.signedCookies[key] || {}; req.session.cookie = cookie; } else { // TODO: refactor var rawCookie = req.cookies[key]; if (rawCookie) { var unsigned = cookieParser.signedCookie(rawCookie, secret); if (unsigned) { var original = unsigned; req.session = cookieParser.JSONCookie(unsigned) || {}; req.session.cookie = cookie; } } } 的选项中传递secret时,它会落入cookieSession块,并最终设置不同的Cookie?我不知道,但它似乎是一个错误。如果我对elsecookieParser使用相同的秘密,那应该是好的。但无论如何......

======

tl; dr需要这样:

cookieSession