Можно ли получить экспресс-сессию по sessionID?

У меня есть приложение NodeJS Express, которое использует экспресс-сеанс. Это прекрасно работает, пока поддерживаются файлы cookie сеанса.

К сожалению, он также должен работать с приложением PhoneGap, которое не поддерживает файлы cookie любого типа.

Мне интересно: возможно ли получить экспресс-сеанс и получить доступ к данным в этом сеансе, используя идентификатор сеанса?

Я думаю, что мог бы добавить идентификатор сеанса в качестве параметра строки запроса для каждого запроса, отправленного приложением PhoneGap, например:

https://endpoint.com/dostuff?sessionID=whatever

Но я не знаю, как сказать экспрессу получить сеанс.


person user1031947    schedule 03.04.2015    source источник
comment
Я не думаю, что экспресс-сеанс поддерживает что-либо, кроме файлов cookie, поскольку обычно предполагается, что в наши дни все так или иначе используют файлы cookie. Вы больше никогда не увидите, чтобы кто-то использовал строки запросов для сохраняемости, это было в девяностых.   -  person adeneo    schedule 03.04.2015


Ответы (2)


Вы, безусловно, можете создать экспресс-маршрут/промежуточное ПО, которое обманывает express-session тем, что входящий запрос содержит файл cookie сеанса. Поместите что-то вроде этого перед промежуточным программным обеспечением сеанса:

app.use(function getSessionViaQuerystring(req, res, next) {
  var sessionId = req.query.sessionId;
  if (!sessionId) return res.send(401); // Or whatever

  // Trick the session middleware that you have the cookie;
  // Make sure you configure the cookie name, and set 'secure' to false
  // in https://github.com/expressjs/session#cookie-options
  req.cookies['connect.sid'] = req.query.sessionId;
  next();
});
person lxe    schedule 03.04.2015

Похоже, req.cookies в моем случае недоступен. Вот еще одно решение, которое воссоздает сеанс с использованием заголовка «x-connect.sid» (вы можете использовать любое имя или даже параметр запроса, если хотите).

Поместите это промежуточное ПО после промежуточного ПО сеанса.

// FIRST you set up your default session like: app.use(session(options));

// THEN you recreate it using your/custom session ID
app.use(function(req, res, next){
    var sessionId = req.header('x-connect.sid');

    function makeNew(next){
        if (req.sessionStore){
            req.sessionStore.get(sessionId, function(err, session){
                if (err){
                    console.error("error while restoring a session by id", err);
                }
                if (session){
                    req.sessionStore.createSession(req, session);
                }
                next();
            });
        } else {
            console.error("req.sessionStore isn't available");
          next();
        }
    }

    if (sessionId) {
        if (req.session){
            req.session.destroy(function(err){
                if (err) {
                    console.error('error while destroying initial session', err);
                }
                makeNew(next);
            });
        } else {
            makeNew(next);
        }
    } else {
        next();
    }
});

person Roman86    schedule 12.04.2018