Экспресс сеанс cookie не устанавливается в браузере - PullRequest
2 голосов
/ 12 марта 2019

Я столкнулся с проблемой, пытаясь реализовать HTTPS через прокси-сервер (первоначально NGINX, теперь AWS ALB) для защиты соединений с сервером моего узла.Мой login запрос обрабатывается очень хорошо, но последующие запросы после login помечаются как isAuthenticated === false, и поэтому мое приложение для узла возвращает 401.

Я знаю, что isAuthenticated === false вызваноcookie-файл сеанса не устанавливается в браузере, однако я не могу понять, почему cookie-файл сеанса не устанавливается (или не отправляется?).

Я настраиваю Express-сеанс, как показано ниже:

app.use(cookieParser('secret'));

app.set('trust proxy', 1);

// add & configure middleware
app.use(session({
    name: 'session',
    store: new redisStore(),
    secret: 'secret',
    resave: false,
    saveUninitialized: false,
    cookie: { httpOnly: true,
        secure: true }
}));

Приложение моего узла находится за AWS Application Load Balancer, который связывается с приложением по HTTP, поэтому я настроил trust proxy в 1.

Моя конфигурация паспорта и локальнаяСтратегия чуть ниже:

// configure passport.js to use the local strategy
passport.use(new LocalStrategy(
    { usernameField: 'email' }, 
    (email, password, done) => {
        mysql.getConnection((err, conn) => {
            conn.query('SELECT u.user_id, u.email, u.password, o.uuid FROM user AS u INNER JOIN organization AS o ON o.id = u.org_id WHERE email = ?;', [email], ( err, rows ) => {
                if (err) throw err;

                if (rows.length !== 1)
                    return done(null, false, { message: 'User does not exist.\n' });
                else if (!bcrypt.compareSync(password, rows[0].password))
                    return done(null, false, { message: 'Incorrect password.\n' });
                else{
                    return done(null, {user_id: rows[0].user_id, email: email, uuid: rows[0].uuid});
                }
            });
            conn.release();
        });
    }
));

Запрос от клиента реакции:

axios.post('https://sub.mydomain.com' + '/api/login', userObj, {withCredentials: true})
.then(res => {
    if (res.status === 200) {
        initUser(res.data, true);
    }
    else {
        this.setState({errors: {password: 'Incorrect username or password'}})

        this.props.history.push('/login');
    }
})
.catch((e) => {
    this.setState({errors: {password: 'Unable to login'}})

    this.props.history.push('/login');
});

При выполнении запроса мне возвращается статус 200 с информацией о пользователе какЯ бы ожидал.См. Скриншоты из PostMan ниже: enter image description here

Также это заголовки ответов в Chrome:

access-control-allow-credentials: true
access-control-allow-origin: https://sub.mydomain.com
content-length: 89
content-type: text/html; charset=utf-8
date: Tue, 12 Mar 2019 07:49:45 GMT
etag: W/"59-T0xi+VpB6A/MLCHMb8Qz3Pq9dwc"
status: 200
vary: Origin
x-powered-by: Express

Где-то вдоль строки кажется, что файл cookie сеансалибо не удается отправить из приложения узла, либо установить в браузере.

На моем локальном компьютере выполняется то же самое, и в браузере без проблем устанавливается cookie.Единственная разница между моим локальным и моим сервером - это ALB перед приложением узла, и я устанавливаю secure: false на своем локальном (так как я не использую HTTPS).

FYI - у меня былоПервоначально пытался использовать NGINX proxy_pass на моем сервере для обработки соединений HTTPS и имел ту же проблему.Я попытался удалить проход прокси и использовать AWS Application Load Balancer после того, как не смог найти решение с NGINX (я думал, что может быть проблема с моей конфигурацией NGINX).Это заставляет меня поверить, что проблема заключается в том, что конфигурация экспресс-сеанса является ее общим знаменателем, однако я могу упустить что-то еще.

FYI 2 - я попытался установить trust proxy в true, 1, 2, 3 и т. Д., Также пытался установить secure на false, также пытался установить httpOnly на false - и бесчисленное множество вариантов выше, но все же я непохоже, он получает cookie в браузере.

FYI 3 - я попытался удалить прокси и вернуться обратно к прямому HTTP-соединению с приложением Node, но я все еще не получаю cookie в своем браузере (или в PostMan).

Надеясь, что кто-то здесь может указать на то, что я упустил в надежде решить эту проблему.

Заранее спасибо!

1 Ответ

0 голосов
/ 14 марта 2019

Таким образом, после нескольких дней расследования выяснилось, что проблема в том, что мой сервер Redis завершил работу и не смог перезапуститься. Facepalm

Идентификатор сеанса не создавался (или не сохранялся), поскольку не мог подключиться к хранилищу Redis для сохранения информации о сеансе на стороне сервера.

Запуск сервера Redis решил проблему немедленно, однако было бы замечательно, если бы экспресс / паспорт имел некоторые подробные записи в журнале, чтобы уведомить пользователей об этом.

Надеюсь, кто-то еще найдет это полезным!

...