** 已解决 **
我在这个问题上挣扎了一段时间。那里有很多类似的帖子,但所提出的解决方案都不适合我。
我正在使用带有 cookie 会话的 Express 和 Passport。当我仅将
secret
传递给 cookieSession 时,一切正常:
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());
它就停止工作了。貌似我的浏览器里设置了cookie,看起来不错,但是没有
req.user
,后续的请求也没有经过认证。
我尝试使用
maxage
代替maxAge
,但没有成功。我可以切换到相同的配置,但使用 express.session()
而不是 express.cookieSession()
并且它 确实 有效,但服务器重新启动时会话会丢失。
有什么帮助吗?
编辑:顺便说一句,我使用的是 Express 3.20.2
这是用户错误。我不确定从哪里得到将
secret
作为字符串传递给 cookieSession()
的语法,但这是无效的。它被忽略,实际上回退到使用 req.secret
,它首先由 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;
}
}
}
因此,当您do在
secret
的选项中传递cookieSession
时,它会落入else
块,并最终设置不同的cookie?我不知道,但这似乎是一个错误。如果我对 cookieParser
和 cookieSession
使用相同的秘密,那应该很好。但无论如何...
========
tl;博士,它需要是这样的:
app.use(express.cookieParser('MySecret'));
app.use(express.cookieSession({
cookie: {
maxAge: 30 * 24 * 60 * 60 * 1000
}
}));