Отправка куки клиенту с экспрессом не работает - PullRequest
0 голосов
/ 04 февраля 2019

Моя текущая настройка - это приложение Node.js, настроенное на Heroku, которое должно установить некоторые файлы cookie для моего клиента (приложение React), используя Express.js, как это.

request.post(authOptions, function(error, response, body) {
  if (!error && response.statusCode === 200) {

    const access_token = body.access_token,
        refresh_token = body.refresh_token;



    let options = {
      url: 'https://api.spotify.com/v1/me',
      headers: { 'Authorization': 'Bearer ' + access_token },
      json: true
    };
request.get(options, function(error, response, body) {
             res.cookie('access_token',access_token, { domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
            res.cookie('refresh_token',refresh_token,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
            res.cookie('user',body.display_name,{ domain: 'example.com', path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });

        res.redirect('https://www.example.com/');
     });
} else {...}}

Это делаетустановить куки, но только в приложении Heroku.Домен, который я предоставляю, полностью игнорируется, что, очевидно, приводит к ошибке при попытке прочитать файлы cookie на стороне клиента.Любой совет?

Редактировать: Добавлена ​​полная функция.

1 Ответ

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

Вот очень упрощенный рабочий код, демонстрирующий настройку файлов cookie в ответ на сетевой запрос:

const express = require('express')
const rp = require('request-promise-native')
const app = express();

app.get("/cookie", function(req, res) {
    rp.get('https://mobilesecurity.win/sample/access_token.json').then(function(body) {
        const domain = 'localhost';
        const parsed = JSON.parse(body);
        const access_token = parsed.access_token;
        const refresh_token = parsed.refresh_token;
        res.cookie('access_token',access_token, { domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
        res.cookie('refresh_token',refresh_token,{ domain: domain, path: '/', expires: new Date(Date.now() + 9000000), httpOnly: false });
        res.status(200).json({'status':'cookies set!'})
    }).catch(function(error) {
        res.status(500).json({'status':'failure', error:error.message});
    });
});

app.listen(8080);

Вот результат:

Chrome cookie result

Обратите внимание, что я использовал localhost в качестве домена, так как я запускаю сервер локально.Вы должны использовать домен, который соответствует вашему имени хоста, иначе браузер откажется установить cookie (по соображениям безопасности).

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