Данные экспресс-сеанса не удаляются из хранилища Mongo при вызове уничтожения в Production - PullRequest
0 голосов
/ 10 февраля 2019

У меня проблема с функцией выхода из приложения.

Проблема

Вызов req.session.destroy не удаляет данные сеанса из сеансов MongoDBколлекция в только для производства .

Запрос попадает на сервер, выполняется метод выхода из системы, ошибка не возвращается, функция уничтожения, запуск console.log в сеансе показывает, что он пуст, но на страницеобновить пользователь все еще вошел в систему, и проверка db.sessions.find () покажет данные сеанса нетронутыми.

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

Используемые пакеты ключей

  • express-session
  • connect-mongo
  • cors

Функциональность отлично работает локально (API и приложение React работают на локальном хосте, только на разных портах).

Производство настроено такчто

  • api.mydomain.com - это сервер Node с Express API и Mongo db.
  • app.mydomain.com - это приложение React, которое отправляет запросы к API.

server.js - важная часть

    //use sessions for tracking logins
var sessionData = {
    name: 'secure_name', // for testing
    secret: 'secure_secret', // for testing
    resave: true,
    rolling: true,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
    cookie: {
        "maxAge": (1000 * 60 * 60 * 7), // 7 days.
        secure: false,
        path: '/',
        domain: process.env.DOMAIN
    }
};

// Setup session with config and make the app use it.
var sessionMiddleware = session(sessionData);
app.use(sessionMiddleware);

...
// User - Logout.
app.get('/api/users/logout', user.logout);

метод user.logout

// Logout user.
exports.logout = (req, res, next) => {

    // Only if there is an active session.
    if (req.session) {

        // delete session object
        req.session.destroy(error => {

            req.session = null;
            if (error) return next(error);

            res.send({ logout: true })
        });
    }
}

Реагировать на запрос метода выхода из системы

        // Logout - end this user session.
    @action logout() {

        // Destroy session.
        return axios.get(config.url + 'api/users/logout', {
                headers: {
                    'Access-Control-Allow-Origin': '*',
                    'Content-Type': 'application/json',
                },
            })

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 февраля 2019

Я нашел решение своей проблемы.Публикация здесь на случай, если кто-нибудь еще столкнется с подобной проблемой.

Запрос GET, отправленный на сервер, не содержит учетных данных, так как по умолчанию это значение равно false.

Решение былоявным образом установить для «with-credentials» значение true в запросе, как показано ниже:

        // Logout - end this user session.
@action logout() {

    // Destroy session.
    return axios.get(config.url + 'api/users/logout', {
            headers: {
                'Access-Control-Allow-Origin': '*',
                'Content-Type': 'application/json',
            },
            withCredentials: true
        })
...