Невозможно получить доступ к cookie из ответа fetch () - PullRequest
0 голосов
/ 01 декабря 2019

Несмотря на то, что этот вопрос задается несколько раз в SO вроде:

fetch: получение файлов cookie из ответа выборки

или

Невозможно установить cookie в браузере с помощью модулей запроса и экспресса в NodeJS

Ни одно из этих решений не могло помочь мне получить cookie из ответа fetch()

Моя настройка выглядит следующим образом:

Клиент

export async function registerNewUser(payload) {
    return fetch('https://localhost:8080/register',
        {
            method: 'POST',
            body: JSON.stringify(payload),
            credentials: 'same-origin',
            headers: {
                Accept: 'application/json',
                'Content-Type': 'application/json'
            }
        });
}

...
function handleSubmit(e) {
    e.preventDefault();

    registerNewUser({...values, avatarColor: generateAvatarColor()}).then(response => {
        console.log(response.headers.get('Set-Cookie')); // null
        console.log(response.headers.get('cookie')); //null
        console.log(document.cookie); // empty string
        console.log(response.headers); // empty headers obj
        console.log(response); // response obj
    }).then(() => setValues(initialState))
}

Сервер

private setUpMiddleware() {
    this.app.use(cookieParser());
    this.app.use(bodyParser.urlencoded({extended: true}));
    this.app.use(bodyParser.json());
    this.app.use(cors({
        credentials: true,
        origin: 'http://localhost:4200',
        optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
        credentials: true
    }));
    this.app.use(express.static(joinDir('../web/build')));
}
...
this.app.post('/register', (request, response) => {
    const { firstName, lastName, avatarColor, email, password }: User = request.body;
    this.mongoDBClient.addUser({ firstName, lastName, avatarColor, email, password } as User)
        .then(() => {
            const token = CredentialHelper.JWTSign({email}, `${email}-${new Date()}`);
            response.cookie('token', token, {httpOnly: true}).sendStatus(200); // tried also without httpOnly
        })
        .catch(() => response.status(400).send("User already registered."))
})

enter image description here

1 Ответ

0 голосов
/ 04 декабря 2019

JavaScript fetch метод не отправляет файлы cookie на стороне клиента и автоматически игнорирует файлы cookie, отправленные со стороны сервера Ссылочная ссылка в MDN , поэтому вы можете использовать метод XMLHttpRequest для отправки запроса от вашего клиентасторона.

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