【问题标题】:Express.js cross-domain session is not savedExpress.js 跨域会话未保存
【发布时间】:2020-06-08 02:59:30
【问题描述】:

我正在尝试制作第三方应用程序,这意味着它将跨多个域运行。 我想为每个使用该应用程序的用户处理一个会话,因此,我使用 express-session 模块来创建它,但每次我发出请求时,它都会为当前请求启动一个新会话......

const express    = require('express'),
      router     = express.Router();
      const session = require('express-session')

router.use(function(req, res, next) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    next();
});

router.use(session({
    secret: 'keyboard cat',
    resave: true,
    maxAge: 2 * 60 * 60 * 1000, // 2 hours
    saveUninitialized: false,
    cookie: { 
        maxAge:  2 * 60 * 60 * 1000 ,
        secure: false,
        sameSite : false,
        httpOnly: false}
}))
router.get( '/',function (req, res, next) {

    // let payload = req.query;
    let isDevClient = req.session.isDevClient  || false;
    console.log('isNew? ', isDevClient );
    res.status(201).send({
        success: true, 
        isDevClient,
        message: 'msg..'
    });

}).post( '/',function (req, res, next) {
    let payload = req.body;
    console.log('isNew? ', req.session.isDevClient )
    req.session.isDevClient = true; 
    res.status(200).send({
        success: true, 
        message: 'ok'
    });
});


module.exports = router;

请求示例

// javascript
fetch('https://127.0.0.1:8443/',{
method : "POST",
credentials: 'include',
})

//Jquery
    $.ajax({
        'type': 'post',
        'url': 'https://127.0.0.1:8443',
         'xhrFields': {
         'withCredential's: true
         }
        'success': function (response) {},
    })

``

【问题讨论】:

  • 你确定 saveUninitialized 应该是假的吗?我认为这是问题所在,因为您的会话没有保存
  • 在和现在一样之前我已经试着让它成为现实......
  • 您是如何提出请求的?提供minimal reproducible example。您是否在响应中看到 Set-Cookie 标头?浏览器是否会在下一个请求中发送 cookie?查看浏览器开发者工具中的网络标签。
  • 我通过简单的 ajax 或 fetch 发出请求。我在 chrome 开发工具中的网络上看到 response header 中的 Set-Cookie 标头
  • 嘿,伙计,你有没有想过这个问题?我遇到了同样的问题。

标签: javascript node.js express express-session


【解决方案1】:

在您的fetch 调用中使用credentials: 'include',否则fetch 不会在跨域请求期间发送cookie。示例:

fetch(..., {
   ...,
   credentials: 'include' 
}

更新:如果未设置 SameSite 属性,似乎最近的 Chrome 版本将不会在跨域请求期间发送 cookie。

设置sameSite : 'none' 应该可以解决它。请注意,chrome 还要求这些 cookie 是安全的。 https://www.chromestatus.com/feature/5633521622188032

顺便说一句,您可以轻松地使用 repl.it 提供示例(如 this

【讨论】:

  • 我用过它会在原帖上显示一个例子
  • 啊,我猜你有一个更新版本的 chrome,如果它没有 SameSite 属性,它不会发送 cookie。我会更新我的答案
  • 我已经更改了服务器端的sameSite : 'none',但它似乎不起作用。
  • 您注意到Secure 部分了吗?它也应该改变
  • 是的,这就是我现在所拥有的......router.use(session({ secret: 'keyboard cat', resave: true, maxAge: 2 * 60 * 60 * 1000, // 2 hours saveUninitialized: false, cookie: { maxAge: 2 * 60 * 60 * 1000 , secure: false, sameSite : 'none', httpOnly: false} }))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多