экспресс-сеанс с хранилищем MongoDB создает новый сеанс при каждом входе в систему, несмотря на включение учетных данных по запросу

#reactjs #express #cookies #cors #express-session

Вопрос:

У меня есть экспресс-серверный API, который я надеюсь использовать для аутентификации, который использует connect-mongodb-session для хранилища экспресс-сеансов. Однако каждый раз, когда я вхожу в систему, он создает новый сеанс, а не использует уже существующий. Я провел некоторое исследование, и все сказали, чтобы я просто включил учетные данные в свой запрос, что я уже делаю.

Вот некоторые из бэкэнда:

 var corsOptions = {
    origin: `http://localhost:3000`,
    credentials: true
}

app.use(cors(corsOptions))
 

И вот некоторые из интерфейсов:

         const requestOptions = {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(formData),
            credentials: 'include' as RequestCredentials,
            mode: 'cors' as RequestMode,
        }

        let response = await fetch('http://localhost:8000/register', requestOptions)
 

Как вы можете видеть, я установил credentials: 'include' , и все же он по-прежнему создает новую сессию при каждом входе в систему.

Кроме того, не следует задавать два вопроса в одном, но интерфейс написан на React, и я сохраняю регистрационную информацию с помощью Redux. Это приводит к тому, что мое приложение выходит из системы при перезагрузке, есть ли какой-либо возможный способ справиться с этим, например, войти в систему с помощью файлов cookie или сохранить хранилище Redux?

Ответ №1:

Я изменил опцию cookie экспресс-сеанса на secure: false , и это, похоже, исправило ее. Странно, так как он был установлен в значение true в первую очередь после того, как кто-то сказал, что исправлена та же проблема.

 app.use(
    session({
        secret: process.env.secret,
        resave: false,
        saveUninitialized: false,
        cookie: { secure: false },
        store: store,
    })
)
 

Ответ №2:

добавьте это промежуточное программное обеспечение поверх промежуточного программного обеспечения сеанса, потому что браузер отправляет метод опции перед методом публикации используйте это, чтобы игнорировать метод опции

 app.use(function (req, res, next) {
if (req.method == "OPTIONS") {
res.send();
res.end();
} else {
next();
}
});