сеанс не сохраняется при использовании безопасного cookie в NodeJS с экспресс-сессией - PullRequest
0 голосов
/ 09 ноября 2018

Я использую NodeJS + express + express-session, чтобы сохранить идентификатор пользователя из любой точки приложения.

На первом маршруте мой сеанс определен

userProfileRoutes.route('/authentication').post((req, res) => {
  req.session.userID = 10; //example
  console.log(req.session)
}

Результат console.log:

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true },
  userID: 10 } // this is the right value

Но тогда, с другого маршрута, я не вижу значения:

userProfileRoutes.route('/edit').get(function (req, res) {
  console.log('After the nav edit route');
  console.log(req.session);
}

А это печатает

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true,
     secure: true }
} // ID VARIABLE DISAPEARS HERE

Я настраиваю express-session, используя следующие параметры:

app.use(session({
  secret: 'secret',
  proxy: true,
  resave: false,
  saveUninitialized: true,
  withCredentials: true,
  cookie: { secure: true },
  store: new MongoStore({ mongooseConnection: db })
}));

Почему мой userID не сохраняется между запросами и на всех маршрутах?

1 Ответ

0 голосов
/ 13 ноября 2018

Вы устанавливаете cookie: {secure: true}, но пытаетесь получить доступ к вашему серверу, используя HTTP.

Из документации экспресс-сессии :

cookie.secure

Обратите внимание, что при установке этого значения в значение true, поскольку совместимые клиенты не будут отправлять cookie-файлы обратно на сервер в будущем, если браузер не имеет HTTPS-соединения.

Обратите внимание, что secure: true - рекомендуемая опция. Однако для этого требуется веб-сайт с поддержкой https, т. Е. HTTPS необходим для безопасных файлов cookie. Если установлена ​​защита и вы получаете доступ к своему сайту по HTTP, файл cookie не будет установлен.

Убедитесь, что вы используете HTTPS (всегда в работе!) Или вы установили для cookie.secure значение false (возможно, и только для разработки!)

Безопасный флаг в куки

Безопасный флаг - это параметр, который может быть установлен сервером приложений при отправке нового файла cookie пользователю в ответе HTTP. Целью безопасного флага является предотвращение несанкционированного просмотра файлов cookie из-за передачи файла cookie в виде открытого текста.

Для достижения этой цели браузеры, поддерживающие флаг безопасности, будут отправлять файлы cookie с флагом безопасности только тогда, когда запрос переходит на страницу HTTPS . Иными словами, браузер не будет отправлять cookie-файл с установленным флагом незашифрованного HTTP-запроса. Установив флаг безопасности, браузер предотвратит передачу файла cookie по незашифрованному каналу.

от https://www.owasp.org/index.php/SecureFlag

Печенье в экспресс-сессии

Следуя общепринятой практике, express-session использует файлы cookie для хранения идентификатора сеанса и серверного хранилища (в вашем случае mongoDB) для хранения данных сеанса . Если браузер не отправляет ваш идентификатор сеанса, поскольку он не может найти действительный файл cookie, ваш сервер будет считать, что сеанса нет, и сохранять идентификатор пользователя в новом сеансе при каждом запросе.

Когда вы дойдете до /authentication, он сохранит идентификатор в новом сеансе. Когда вы пытаетесь прочитать другой запрос, идентификатор сеанса изменяется, и у вас нет значения в userID.

...