Nodejs не будет устанавливать cookie для приложения React CRA даже с прокси - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть приложение nodejs / express + React CRA, и я пытаюсь установить cookie-файл из nodejs.Сервер находится на порте 4001, поэтому в моем проекте project Rejj.json у меня установлено "proxy": "http://localhost:4001", но cookie все равно не будет установлен в браузере.

Я тестировал его в производственном режиме, какхорошо, с приложением React, обслуживаемым напрямую от nodejs, и там все прекрасно работает.

Вот как я устанавливаю cookie.Я попробовал несколько различных комбинаций опций здесь, и все они имеют одинаковый результат.

res.cookie('jwt', token, {
    httpOnly: false,
    sameSite: false,
    signed: false,
    secure: false,
    encode: String
});
res.header('Access-Control-Allow-Credentials', 'true');

Редактировать: На стороне клиента я использую Axios для своих запросов ajax.

Редактировать:

Вот функция конечной точки для входа (POST / api / users / login):

login: function(req, res) {
    User.findOne({
        $or: [{email: req.body.username}, {username: req.body.username}]
    }).exec().then(user => {
        if(user) {
            if(user.checkPassword(req.body.password)) {
                jwt.sign({ userID: user._id }, 'secret', (err, token) => {
                    res.cookie('jwt', token, {
                        httpOnly: false,
                        sameSite: false,
                        signed: false,
                        secure: false,
                        encode: String
                    });
                    res.header('Access-Control-Allow-Credentials', 'true');
                    res.status(200).send({ status: 'ok', message: 'Success'});
                });
            }
            else {
                return res.status(401).send({ status: 'error', message: 'Invalid username/password combination. Please try again.' });
            }
        }
        else {
            return res.status(401).send({ status: 'error', message: 'Invalid username/password combination. Please try again.' });
        }
    }, err => {
        return res.status(500).send({ status: 'error', message: 'unexpected error' });
    });
}

Вот код входа на стороне клиента:

login(username, password) {
    return new Promise((resolve, reject) => {
        axios({
            method: 'post',
            url: 'http://localhost:4001/api/users/login',
            data: {
                username,
                password
            }
        }).then((res) => {
            resolve(res.data);
        }, (err) => {
            reject(err);
        });
    });
}

Сервер находится на порту 4001, сервер React CRA на 3000

1 Ответ

0 голосов
/ 01 декабря 2018

Чтобы разрешить браузеру устанавливать файлы cookie и придерживаться той же политики происхождения, ваш клиентский код должен запрашивать http://localhost:3000/api/users/login (тот же хост, что и клиент) вместо (прокси) URL-адреса сервера (порт 4001).

Вы также можете указать базовый URL как ${window.location.origin}/api или просто /api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...