我的express-session
正在运行,我使用非常短的Cookie max-age(10秒)进行了测试,并按预期工作:
app.use(session({
secret: 'xxx',
resave: false,
saveUninitialized: true,
cookie: { secure: true, maxAge: 10000 }
}));
奇怪的是,我在Chrome开发者工具中的任何地方找不到cookie。由express-session
隐藏的Cookie设置在哪里?
更新#2: See my own answer如果您想知道在另一个域中向ajax request
发送express server
,请知道在哪里看到Cookie。
更新 - 我的快速服务器上的会话管理:
app.post('/verify', function(req, res){
let out = [];
if(!req.session.userId){
if(typeof req.body.token !== 'undefined'){
admin.auth().verifyIdToken(req.body.token)
.then(function(decodedToken) {
let uid = decodedToken.uid;
if(!req.session.userId){
req.session.userId = uid;
}
res.send(uid);
// ...
}).catch(function(error) {
// Handle error
res.send(error);
});
}else{
res.send('no token received');
}
}else{
res.send('already logged in by session with uid: ' + req.session.userId + ' | session id: ' + req.session.id);
}
});
这就是服务器“启动”的方式:
app.listen(port, function () {
console.log('Example app listening on port ' + port + '!');
});
问题是会话有效,但我无法看到cookie:
答案 0 :(得分:2)
您可以在Chrome DevTools中找到Cookie:
Application
> Storage
> Cookies
> URL of the express Server
为了表明快递的cookie存储正确,我从一个简单的测试服务器开始。请注意,您在问题中使用了cookie.secure = true
,这需要https
与服务器的连接。否则,浏览器会立即删除cookie。所以,让我们使用这个简单的:
let fs = require('fs');
let privateKey = fs.readFileSync('../../../apache/conf/ssl.key/server.key', 'utf8');
let certificate = fs.readFileSync('../../../apache/conf/ssl.crt/server.crt', 'utf8');
let credentials = {key: privateKey, cert: certificate};
let https = require('https');
let app = require('express')();
let session = require('express-session');
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: {secure: true, maxAge: 10000}
}));
app.all('*', function(req, res) {
res.status(200);
res.setHeader('Content-Type', 'text/html');
if (!req.session.views) {
req.session.views = 0;
}
req.session.views++;
res.write('<p>views: ' + req.session.views + '</p>');
res.end();
});
https.createServer(credentials, app).listen(8080);
如果工作正常,您应该可以在浏览器中打开https://localhost:8080
并看到views: 1
等内容。
刷新浏览器时,每次请求都应增加计数。没有请求的cookie的最长生命周期是10秒。在此之后,计数将再次从1
开始。
在10秒的生命周期内,您可以在Application
&gt;下看到Cookie Storage
&gt; Cookies
&gt; Chrome DevTools中的URL of the express Server
。当然,在这种情况下,cookie的值是加密的。
正如您稍后提到的,您的问题属于AJAX
次来电。一般来说,它与上面完全相同。您甚至可以在AJAX
&gt;中立即看到Storage
创建的Cookie。 Cookies
标签。但仅限于,如果您的cookie配置正确并且属于同一个域。
Storage
标签中的Cookie由Cookie domain
和Cookie path
选中。该列表将显示并更新与模式匹配的所有内容。因此,在您的示例中,似乎Cookie与请求页面不匹配。
正如我在您的页面上看到的那样,您正在打开包含ULR https://***.firebaseapp.com
的页面,并向https://***.herokuapp.com/verify/
执行AJAX请求,这是两个完全不同的域。这就是为什么你不能在Storage
标签中看到它们的原因!
如果仍然无效,则在使用同一个域时,请在cookie.path
配置中设置session
。然后一切都应该如上所述工作。 ;)
答案 1 :(得分:0)