Файлы cookie CORS не сохраняются в браузере - PullRequest
0 голосов
/ 21 июня 2019

У меня есть node.js auth api, обслуживаемый на auth.app.loc, внешний интерфейс next.js (реагирует), обслуживаемый на app.loc, а nginx действует как обратный прокси.

Любой мой запрос разрешается успешно, за исключением того, что файлы cookie не отправляются с сервера.

Вот мой auth сервис подведен. Подается на порт 5000 в док-контейнере.

fastify.register(require('fastify-cookie'));
fastify.register(require('fastify-cors'), { 
  origin: ['http://app.loc', 'http://192.168.0.248:3000'],
  credentials: true,
});

fastify.post('/cookie', async (req, res) => {
  res.setCookie('foo', 'foo');
  res.header('bar', 'bar');
  res.code(204);
});

Вот фрагмент моего интерфейса. Подается на порту 3000 в док-контейнере.

const response = await fetch('http://auth.app.loc/cookie', {
  method: 'post',
  headers: {
      'Accept': 'application/json, text/plain, */*',
      'Content-Type': 'application/json'
  },
  credentials: 'include',
  body: JSON.stringify({login, password})
});

И конфиг обратного прокси (nginx), также в контейнере Docker.

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        server_name app.loc;
        listen 80;
        location / {
            proxy_pass http://192.168.0.248:3000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    server {
        server_name auth.app.loc;
        listen 80;
        location / {
            proxy_pass http://192.168.0.248:5000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

Файл хоста Windows разрешает app.loc auth.app.loc в мой ip: 192.168.0.248

Теперь выполнение запроса из приложения реагирования через fetch приводит к: screenshot from chrome

Но сделать такой же запрос (с помощью инструментов разработчика Chrome, скопируйте как curl bash) в Postman:

curl 'http://auth.app.loc/cookie' -H 'Accept: application/json, text/plain, */*' -H 'Referer: http://app.loc/signin' -H 'Origin: http://app.loc' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' -H 'Content-Type: application/json' --data-binary '{"login":"login","password":"password"}' --compressed --insecure

в результате set-cookie передается

screenshot from postman

Почему заголовок set-cookie не применяется при использовании fetch?

Я почти уверен, что это как-то связано с fetch, но я уже использую credentials: 'include'

@ редактировать

Доступ к веб-интерфейсу через http://192.168.0.248:3000/ url и изменение URL-адреса для извлечения на http://192.168.0.248:5000/cookie работает без проблем. Печенье проходит мимо. Но почему доменный подход не работает? cookie getting passed

1 Ответ

0 голосов
/ 21 июня 2019

Ни за что ...

Я хотел отладить его быстро и не заполнил домен часть настроек cookie . Кажется, что без него cookie даже не будет сохранен в браузере, но это не проблема для Почтальона.

  res.setCookie('foo', 'foo', {
    domain: '.app.loc' //saves everything
  });
...