代码之家  ›  专栏  ›  技术社区  ›  low_rents

express会话cookie隐藏在哪里?

  •  6
  • low_rents  · 技术社区  · 8 年前

    我的 express-session 正在工作,我用极短的cookie max age(10秒)测试了它,它按预期工作:

    app.use(session({
      secret: 'xxx',
      resave: false,
      saveUninitialized: true,
      cookie: { secure: true, maxAge: 10000 }
    }));
    

    奇怪的是,我在Chrome开发工具的任何地方都找不到cookie。cookie设置的位置 快速会话 隐藏的

    更新#2: See my own answer 如果要知道在何处查看cookie,请发送 ajax request express server 在另一个域上。

    更新-my 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);
        }
    });
    

    这就是服务器“启动”的方式:

    app.listen(port, function () {
      console.log('Example app listening on port ' + port + '!');
    });
    

    问题是会话正常,但我无法看到cookie:

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  3
  •   eisbehr    8 年前

    TL;博士

    您可以在Chrome开发工具中的以下位置找到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秒内,您可以在 应用 &燃气轮机; 存储 &燃气轮机; 曲奇饼 &燃气轮机; express服务器的URL 镀铬DevTools内部。当然,在这种情况下,cookie的值是加密的。

    Where to find cookie in Chrome DevTools

    使用AJAX时的一些提示

    正如您稍后提到的,您的问题属于 AJAX 电话。总的来说,都和上面一样。你甚至可以看到 AJAX 立即在中创建Cookie 存储 &燃气轮机; 曲奇饼 选项卡。但仅当cookie配置正确且属于同一域时。

    里面的饼干 存储 选项卡由cookie选择 domain 还有饼干 path . 该列表将显示并更新与该模式匹配的所有内容。因此,在您的示例中,cookie似乎与请求页面不匹配。

    正如我在你的页面上看到的,你正在用ULR打开页面 https://***.firebaseapp.com 并执行AJAX请求 https://***.herokuapp.com/verify/ ,这是两个完全不同的域。这就是为什么你在 存储 选项卡!

    如果这仍然不起作用,则在使用同一域时,设置 cookie.path 在您的 session 配置那么一切都应该如上所述

        2
  •  1
  •   low_rents    8 年前

    我现在发现,我的问题遗漏了一些重要信息。
    我没有提到的是,请求是通过 ajax .
    在Chrome中(我猜在大多数浏览器中),你看不到那些显示“站点”cookie的“连接cookie”。您可以在连接选项卡中的ajax请求详细信息下看到它们。

    enter image description here

    推荐文章