Проблемы с исчезновением куки connect.sid в продакшене после включения CORS

Вопрос или проблема

У меня возникла проблема с куки connect.sid в моем приложении на Express. Все работает идеально в локальной среде, где куки создаются и сохраняются как ожидается. Однако, как только я развертываю приложение в продакшн и включаю CORS, куки connect.sid, похоже, быстро исчезают после генерации.

Детали окружения:
Фреймворк: Express.js
Сессия Middleware: express-session

const corsOptions = {
  origin: ['https://voiceblogify.netlify.app'], 
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
  credentials: true,
  allowedHeaders: ['Content-Type', 'Authorization'], 
};

app.use(cors(corsOptions));

app.use(session({
  secret: process.env.SECRET_SESSION_KEY,
  resave: false,
  saveUninitialized: false,
  cookie: {
    maxAge: 1000 * 60 * 60 * 24, // 1 день
    secure: process.env.NODE_ENV === 'production', 
    httpOnly: true,
    sameSite: 'None', domain: '.voiceblogify.netlify.app'
  },
}));

[вставить описание изображения здесь](https://i.sstatic.net/6JgEmdBM.png)

живой ссылкой https://voiceblogify.netlify.app/

Описание проблемы:
Локальная среда: Куки connect.sid создаются и сохраняются без проблем.
Продуктивная среда: После включения CORS и установки флага secure в true, куки connect.sid создаются, но быстро исчезают.
Дополнительные наблюдения:
Сервер находится за прокси, поэтому я установил app.set(‘trust proxy’, 1);.
Я добавил логирование для мониторинга куки и состояния сессии на каждом запросе.
Вопросы:

https://voiceblogify.netlify.app/

useEffect(() => {

        async function checkAuth() {
            try {
                const response = await fetch('https://voiceblogify-backend.onrender.com/status', {
                    method: 'GET',
                    credentials: 'include'
                });
                const data = await response.json();

                console.log(data)

                if (data.authenticated) {
                    setIsAuthenticated(true);
                    setUser({
                        name: data.name,
                        profilepicurl: data.profilepic,
                        userId: data.id
                    });
                    setPaidMember(false);
                }
            } catch (error) {
                console.error('Ошибка проверки авторизации:', error);
            }
        }

        checkAuth();
    }, []);

вызов с фронтенд стороны

Почему куки connect.sid быстро уничтожаются в продакшен-версии?
Есть ли какие-либо специфические конфигурации, которые я мог бы пропустить, связанные с CORS или управлением сессиями?
Могут ли быть проблемы с тем, как настроен прокси, которые могут повлиять на передачу куки?

Ответ или решение

Проблема, с которой вы столкнулись, связана с конфигурацией куки и CORS в вашем приложении на Express.js. Давайте подробнее рассмотрим возможные причины исчезновения куки connect.sid в продакшене и дадим рекомендации по их устранению.

1. Конфигурация CORS

Вы правильно указали параметр credentials: true в настройках CORS. Однако, важно также убедиться в корректной обработке заголовка Access-Control-Allow-Origin. Он должен соответствовать источнику, с которого поступает запрос, в вашем случае это https://voiceblogify.netlify.app.

2. Настройки куки

Параметры куки, такие как secure, httpOnly, и sameSite, могут сильно влиять на поведение куки в браузере:

  • secure: При установке этого параметра значение куки будет отправляться только по HTTPS. Убедитесь, что ваше приложение работает через HTTPS в продакшене.
  • httpOnly: Это значение защищает куки от доступа со стороны JavaScript. Это безопасная настройка, но более не может вызвать проблему, если ваш куки настроен правильно.
  • sameSite: Вы установили sameSite: 'None', но также необходимо убедиться, что у вас установлен параметр secure. Если secure установлен в true, но ваше приложение работает через HTTP, это может привести к проблемам с передачей куки.

3. Прокси и доверие

Вы упомянули, что ваш сервер находится за прокси. Важно установить app.set('trust proxy', 1);, как вы и сделали, чтобы Express корректно обрабатывал протокол (HTTP или HTTPS).

4. Проверка состояния сервера

В вашем фронтенд-коде вы используете credentials: 'include', что правильно для отправки куки вместе с запросами. Убедитесь, что на стороне сервера вы не только правильно обрабатываете запросы, но и слушаете ошибки:

app.get('/status', (req, res) => {
    if(req.session && req.session.user) {
        res.json({ authenticated: true, name: req.session.user.name, id: req.session.user.id, profilepic: req.session.user.profilepic });
    } else {
        res.json({ authenticated: false });
    }
});

Рекомендации

  1. Убедитесь, что ваш сайт работает через HTTPS в продакшене.
  2. Перепроверьте конфигурацию CORS и убедитесь, что правильный заголовок Access-Control-Allow-Origin установлен.
  3. Проверьте, что при установке sameSite: 'None', параметр secure также установлен в true.
  4. Проверьте логи на предмет ошибок во время аутентификации, чтобы убедиться, что сессии используются правильно.
  5. Проверьте настройки вашего прокси-сервера на предмет любых потенциальных ошибок конфигурации.

Заключение

Следуя этим шагам и рекомендациям, вы сможете устранить проблему с исчезновением куки connect.sid в продакшене после включения CORS. Если проблемы все еще сохраняются, рассмотрите возможность отладки с использованием инструментов разработчика в браузере, чтобы наблюдать за поведением куки и заголовков запросов.

Оцените материал
Добавить комментарий

Капча загружается...