Я пытаюсь установить файл cookie для хранения сеанса с помощью экспресс-сеанса. Я отправляю запросы через HTTPS.
app.use(session({
secret: env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // Ensure secure is set to true for HTTPS
sameSite: 'none', // Required for cross-origin cookies
httpOnly: true,
maxAge: 60 * 60 * 1000 // 1 hour
},
rolling: true,
store: MongoStore.create({
mongoUrl: env.MONGODB_CONNECTION_STRING
})
}));
Если бы я только поставил:
cookie: {
httpOnly: true,
maxAge: 60 * 60 * 1000 // 1 hour
},
Затем браузер получает файл cookie, но он не работает, поскольку поступает из https и перекрестного происхождения. Если я поставлю:
cookie: {
secure: true, // Ensure secure is set to true for HTTPS
sameSite: 'none', // Required for cross-origin cookies
httpOnly: true,
maxAge: 60 * 60 * 1000 // 1 hour
},
Тогда cookie вообще не будет получен во внешнем интерфейсе. Я развернул как интерфейсную, так и серверную часть в Vercel.
Я попытался поместить в файл cookie secure: true, SameSite: 'none', но тогда файл cookie вообще не был получен во внешнем интерфейсе.
Я обновил вопрос. И да, он отправляется по https.
Чтобы устранить проблему, попробуйте выполнить проверку false.
Я сделал прокатку: ложь. Но файл cookie по-прежнему не отправляется. Когда я устанавливаю secure: true, сервер не отправляет файлы cookie, в противном случае он отправляет.
переход на false был запрошен для тестирования на основе документации expressjs.com/en/resources/middleware/session.html. Пожалуйста, ознакомьтесь с подразделами, включенными в него и неинициализированными. Сводка меняется: true uninitialized: false не будет отправлять файлы cookie. Цитируемый текст: «Примечание. Если для этого параметра установлено значение true, а для параметра saveUninitialized установлено значение false, файл cookie не будет установлен в ответе с неинициализированным сеансом. Этот параметр изменяет поведение только тогда, когда для запроса был загружен существующий сеанс. ."
В дополнение к моему предыдущему комментарию, пожалуйста, проверьте этот пост: stackoverflow.com/questions/62862094/… В основном он состоит из двух пунктов: SameSite:none и app.set('trust proxy', 1); Посмотрите, применимо ли это к вашему случаю.
В дополнение к комментарию выше обратите внимание также на этот момент: для ясности: браузер не отклоняет файлы cookie. Вместо этого файлы cookie сохраняются на имя стороннего доменного имени, с которого отправляется ответ. Это также включено в тот же пост.
Проблема все еще актуальна?
Да, проблема решена. Я добавил proxy: true в сеансе, и теперь он работает.
Спасибо за обновление. Другим будет полезно, если вы обновите это решение в качестве ответа на сообщение.
Сделаю. Спасибо!
Проблема решена путем установки доверенного прокси.
app.set('trust proxy', 1) // trust first proxy
Мохит Шарма подтвердил то же самое в своих комментариях.
Цитата:
Для понимания вопроса уточните пожалуйста - В заголовке поста secure написано true, то же в третьем коде false :secure:false, нет ли здесь опечатки? Дополнительный момент, который следует уточнить: это отправляется по http или https?