#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 «живым» по запросам.
- Установите «доверенный прокси» в коде вашего сервера:
app.set('trust proxy', 1)
- Установите заголовок 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 и передать токен в теле ваших запросов, это не идеальный вариант, но это самый безопасный способ, который я мог придумать, чтобы сохранить идентификаторы в безопасности.