express-session cookie 隐藏在哪里?
Where is the express-session cookie hidden?
我的 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: 如果你想知道在哪里可以看到 cookie 如果你发送一个 ajax request
到一个 express server
在另一个域上。
更新 - 我的快速服务器上的会话管理:
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);
}
});
服务器就是这样"started":
app.listen(port, function () {
console.log('Example app listening on port ' + port + '!');
});
问题是会话有效,但我看不到 cookie:
TL;DR
您可以在 Chrome DevTools 下找到 Cookie:
Application
> Storage
> Cookies
> URL of the express Server
从哪里开始
为了证明 express 的 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
开始。
在 DevTools 中哪里可以找到 Cookie
在 10 秒的生命周期内,您可以在 Chrome DevTools 中的 Application
> Storage
> Cookies
> URL of the express Server
下看到 cookie。当然,本例中 cookie 的值是加密的。
使用AJAX
时的一些提示
正如你后面提到的,你的问题属于AJAX
个电话。总的来说,都和上面一样。您甚至可以在 Storage
> Cookies
选项卡中即时看到 AJAX
创建的 cookie。但前提是您的 cookie 配置正确并且属于同一域。
Storage
选项卡中的 cookie 由 cookie domain
和 cookie path
选择。该列表将显示并更新与模式匹配的所有内容。因此,在您的示例中,cookie 似乎与请求页面不匹配。
正如我在您的页面上看到的那样,您正在使用 ULR https://***.firebaseapp.com
打开页面并向 https://***.herokuapp.com/verify/
发出 AJAX 请求,这是两个完全不同的域。这就是为什么您在 Storage
选项卡中看不到它们的原因!
如果仍然无效,请在使用相同域时,在 session
配置中设置 cookie.path
。然后一切都应该如上所述工作。 ;)
我的问题遗漏了一些重要信息,现在我发现了。
我没有提到的是,请求是通过 ajax
.
发送的
在 Chrome 中(我想在大多数浏览器中)你看不到那些 "connection cookies" 显示 "site" cookies 的地方。您可以在 ajax 请求的详细信息下的连接选项卡中看到它们。
我的 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: ajax request
到一个 express server
在另一个域上。
更新 - 我的快速服务器上的会话管理:
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);
}
});
服务器就是这样"started":
app.listen(port, function () {
console.log('Example app listening on port ' + port + '!');
});
问题是会话有效,但我看不到 cookie:
TL;DR
您可以在 Chrome DevTools 下找到 Cookie:
Application
> Storage
> Cookies
> URL of the express Server
从哪里开始
为了证明 express 的 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
开始。
在 DevTools 中哪里可以找到 Cookie
在 10 秒的生命周期内,您可以在 Chrome DevTools 中的 Application
> Storage
> Cookies
> URL of the express Server
下看到 cookie。当然,本例中 cookie 的值是加密的。
使用AJAX
时的一些提示正如你后面提到的,你的问题属于AJAX
个电话。总的来说,都和上面一样。您甚至可以在 Storage
> Cookies
选项卡中即时看到 AJAX
创建的 cookie。但前提是您的 cookie 配置正确并且属于同一域。
Storage
选项卡中的 cookie 由 cookie domain
和 cookie path
选择。该列表将显示并更新与模式匹配的所有内容。因此,在您的示例中,cookie 似乎与请求页面不匹配。
正如我在您的页面上看到的那样,您正在使用 ULR https://***.firebaseapp.com
打开页面并向 https://***.herokuapp.com/verify/
发出 AJAX 请求,这是两个完全不同的域。这就是为什么您在 Storage
选项卡中看不到它们的原因!
如果仍然无效,请在使用相同域时,在 session
配置中设置 cookie.path
。然后一切都应该如上所述工作。 ;)
我的问题遗漏了一些重要信息,现在我发现了。
我没有提到的是,请求是通过 ajax
.
发送的
在 Chrome 中(我想在大多数浏览器中)你看不到那些 "connection cookies" 显示 "site" cookies 的地方。您可以在 ajax 请求的详细信息下的连接选项卡中看到它们。