Проблема с атрибутом cookie на том же сайте

#node.js #passport.js #express-session #samesite

#node.js #passport.js #экспресс-сессия #тот же сайт

Вопрос:

У меня есть веб-приложение с react во внешнем интерфейсе и node во внутреннем интерфейсе.

Я использую аутентификацию по паспорту с помощью стратегии passport-saml. С момента последнего обновления браузера я вижу проблему. Как только я пытаюсь войти в систему, я попадаю на страницу аутентификации, и она снова возвращается на страницу приложения, затем на страницу аутентификации, и это продолжается. похоже, я попал в цикл перенаправления.

Как только я отключил флаг атрибута samesite в Chrome, проблема была решена.

Я прочитал несколько статей и понял, что причиной этого является атрибут samesite. (пожалуйста, поправьте меня, если я ошибаюсь. Также хочу знать), где мы будем добавлять это в серверную часть.. Я использовал модуль сеанса node Express и добавил объект cookie как :-

cookie: {sameSite: 'none', secure: true}

Может кто-нибудь, пожалуйста, помочь мне найти решение для этого?

Комментарии:

1. Используемые версии express и express-session «express»: «^ 4.14.0» и «express-session»: «^ 1.17.1»,

Ответ №1:

Находится ли ваше приложение за прокси-сервером с включенным ssl?

У меня была похожая проблема с аналогичной настройкой и похожими симптомами, но я уже переключился с saml на oauth (без использования passport), поэтому я не уверен, поможет ли это вам.

В любом случае, мне нужно было сделать две вещи, чтобы сохранить сессионный cookie «живым» по запросам.

  1. Установите «доверенный прокси» в коде вашего сервера: app.set('trust proxy', 1)
  2. Установите заголовок X-Forwarded-Proto в конфигурацию прокси-сервера (мой — nginx):
     location / {
      proxy_set_header X-Forwarded-Proto $scheme;
      ...
    }
  

Ответ №2:

Я не уверен, что это ваш случай, но я предполагаю, что ваше приложение развернуто (я не сталкивался с этой проблемой в localhost, поэтому ваша проблема может быть где-то в другом месте), и ваш сеанс устанавливается.

Через 3 дня пытаюсь разобраться. Я наконец нашел способ обойти эту проблему, это не исправление, я совершенно уверен, что PassportJS в конечном итоге найдет решение для этого, но пока это позволило мне получить пользователя из аутентификации.

Поскольку мы не можем получить пользователя из файла cookie, но информация находится в сеансе сервера, способ получить эту информацию — добавить в ‘server.js ‘ маршрут для получения пользователя непосредственно из сеанса сервера:

 app.get('/api/getUser', (req, res) => {
  res.json(req.session.user);
});
  

По какой-то причине, я полагаю, из-за отсутствия файлов cookie каким-то образом, использование req.session внутри маршрутизатора возвращает undefined, но если используется внутри ‘server.js ‘ (или индексный файл вашего сервера) Он получает сеанс.

Если вам нужен req.user._id или какая-либо другая конфиденциальная информация для других запросов, я бы рекомендовал вернуть jwtToken с этой информацией во внешний интерфейс (в res.json), затем сохранить токен непосредственно в localStorage и передать токен в теле ваших запросов, это не идеальный вариант, но это самый безопасный способ, который я мог придумать, чтобы сохранить идентификаторы в безопасности.