Экспресс-сессия не может уничтожить сессию - PullRequest
0 голосов
/ 30 апреля 2018

Я инициализирую express-session:

const session = require('express-session')
const MongoStore = require('connect-mongo')(session);
//use sessions for tracking logins
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: false,
  store: new MongoStore({
    mongooseConnection: mongoose.connection
  })
}));

Мое промежуточное ПО для проверки подлинности:

function requiresLogin(req, res, next) {
  if (req.session && req.session.userId) {
        console.log('Session OK ' + JSON.stringify(req.session) );
    return next();
  } else {
    var err = new Error('You must be logged in to view this page.');
    err.status = 401;
    return next(err);
  }
}

Моя logout конечная точка:

// GET /logout
exports.logout = function(req, res, next) {
  if (req.session) {
    // delete session object
    req.session.destroy(function(err) {
      if(err) {
        return next(err);
      } else {
                req.session = null;
                console.log("logout successful");
        return res.redirect('/');
      }
    });
  }
};

Мои тесты:

Я отправляю запрос на конечную точку test, которая находится за промежуточным программным обеспечением requiresLogin, и получаю (как и ожидалось):

Error: You must be logged in to view this page.

Я отправляю запрос на конечную точку login и получаю файл cookie:

set-cookie: connect.sid=s%3A0doMoVwGPkcVUgar3uP5WR36b7k9_v27.O2B8vl35TQLiet3WltP2UAH3iuaeif3%2BPDActkTBYUw; Path=/; HttpOnly

Я снова использую этот файл cookie на моей test конечной точке:

Session OK {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"userId":"5ae6ddee1239c157ec36c06c"}

Я выполняю /logout, за что получаю

logout successful

После этого я снова пробую свою test конечную точку с файлом cookie, который, как мне кажется, я только что уничтожил:

Session OK {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"userId":"5ae6ddee1239c157ec36c06c"}

Сессия не затрагивается в базе данных после успешного destroy.

Почему я могу использовать свой файл cookie аутентификации сеанса после того, как я уничтожил сеанс?

EDIT

Вопрос должен быть удален. Я использовал неправильный Cookie, когда выполнял /logout. Глупая ошибка, мой плохой ...

1 Ответ

0 голосов
/ 30 апреля 2018

По умолчанию промежуточное программное обеспечение express-sesssion проверяет наличие существующего файла cookie сеанса, а если оно не существует, оно создает новый файл cookie и новый объект сеанса по любому запросу, на котором запущено промежуточное программное обеспечение.

Чтобы поддерживать функцию входа в систему, вам необходимо реализовать некоторую форму аутентификации, а не создавать новый файл cookie сеанса и объект сеанса, если сами учетные данные для входа не проверяются. Или вы можете просто иметь флаг в своем объекте сеанса, который указывает, была ли авторизована учетная запись для этого сеанса или нет, и вы проверяете и наличие сеанса, и то, что проверенный флаг был установлен.

Куски кода, которые вы показываете, выглядят так, как будто каждое входящее соединение просто создает новый объект сеанса (если он еще не существует), и все, что делает ваш проверочный код, проверяет, существует ли объект сеанса, что всегда будет, потому что как только вы избавитесь от него, следующий входящий запрос снова запустит промежуточное ПО и создаст новый сеансовый файл cookie и объект.

См. , как реализовать аутентификацию входа в node.js для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...