快递会话cookie隐藏在哪里?

时间:2018-02-02 12:40:59

标签: javascript node.js express express-session

我的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:

enter image description here

2 个答案:

答案 0 :(得分:2)

TL; DR

您可以在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开始。

在DevTools

中找到Cookie的位置

在10秒的生命周期内,您可以在Application&gt;下看到Cookie Storage&gt; Cookies&gt; Chrome DevTools中的URL of the express Server。当然,在这种情况下,cookie的值是加密的。

Where to find cookie in Chrome DevTools

使用AJAX时的一些提示

正如您稍后提到的,您的问题属于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)

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

enter image description here