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 请求的详细信息下的连接选项卡中看到它们。