Express. js междоменный сеанс не сохраняется - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь создать стороннее приложение, которое будет работать в нескольких доменах. Я хочу обработать сеанс для каждого пользователя, который использует приложение, поэтому я использовал модуль 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) {},
    })

``

1 Ответ

0 голосов
/ 24 февраля 2020

Используйте credentials: 'include' в своем вызове fetch, в противном случае fetch не будет отправлять куки во время междоменного запроса. Пример:

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

Обновление: похоже, что последняя версия Chrome не будет отправлять куки во время междоменных запросов, если атрибут SameSite не установлен.

Настройка sameSite : 'none' должна исправить это. Обратите внимание, что chrome также требует, чтобы эти файлы cookie были безопасными. https://www.chromestatus.com/feature/5633521622188032

Кстати, вы можете легко предоставить примеры с repl.it (например, this )

...