http-proxy-middleware, как скопировать все заголовки/cookie

Я использую облегченный сервер Джона Папы с промежуточным программным обеспечением прокси-сервера HTTP от chimurai в качестве сервера разработки. проблема с моим файлом cookie сеанса, я не могу сохранить файл cookie сеанса, полученный с реального сервера. Я видел это решение: https://github.com/chimurai/http-proxy-middleware/issues/78

но я не вижу сходства с моим bs-config.js:

var proxy = require('http-proxy-middleware');

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('demo/webservice/jaxrs', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true   // for vhosted sites, changes host header to match to target's host
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};

Кто-нибудь знает, как объединить эти два?

ОБНОВЛЕНИЕ: это часть заголовков ответа:

set-cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3; Path=/appServer/webservice/jaxrs; Secure
strict-transport-security:max-age=31622400; includeSubDomains
Transfer-Encoding:chunked

UPDATE2: я думаю, что моя конфигурация должна выглядеть так:

var proxy = require('http-proxy-middleware');

function relayRequestHeaders(proxyReq, req) {
    Object.keys(req.headers).forEach(function (key) {
        proxyReq.setHeader(key, req.headers[key]);
    });
};

function relayResponseHeaders(proxyRes, req, res) {
    Object.keys(proxyRes.headers).forEach(function (key) {
            res.append(key, proxyRes.headers[key]);
        });
};

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('/skybox', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true,   // for vhosted sites, changes host header to match to target's host
                onProxyReq: relayRequestHeaders,
                onProxyRes: relayResponseHeaders
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};

но теперь res.append не определен :(


person Avi    schedule 15.08.2016    source источник
comment
Можете ли вы предоставить ответ RAW от цели? Какое значение set-cookie в этом ответе RAW?   -  person chimurai    schedule 15.08.2016
comment
Я обновил свой оригинальный пост. это файл cookie сеанса: set-cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3; Путь=/сервер приложений/веб-сервис/jaxrs; Безопасный   -  person Avi    schedule 16.08.2016
comment
Можете ли вы также предоставить запрос RAW, который отправляется на сервер через порт 3003?   -  person chimurai    schedule 18.08.2016
comment
Я использую приложение для создания реакции, и когда я использую промежуточное программное обеспечение прокси, я получаю только токен частичной аутентификации (размер уменьшен), какая причина для этого?   -  person Sai Chandra    schedule 21.05.2020


Ответы (5)


попытайся:

var cookie;
function relayRequestHeaders(proxyReq, req) {
  if (cookie) {
    proxyReq.setHeader('cookie', cookie);
  }
};

function relayResponseHeaders(proxyRes, req, res) {
  var proxyCookie = proxyRes.headers["set-cookie"];
  if (proxyCookie) {
    cookie = proxyCookie;
  }
};

Работает с lite-сервером

person B.Ma    schedule 25.10.2016
comment
Спасибо за этот совет, он решил аналогичную проблему с nodejs и http-proxy-middleware. - person Youssef; 19.04.2019

Не уверен, как настроен ваш локальный хост: 3003; С или без https:...

Допустим, вы используете http://localhost:3000 (не https:); Атрибут файла cookie Secure из вашей цели может быть причиной того, что ваш браузер пропускает файл cookie.

4.1.2.5. Безопасный атрибут

Атрибут Secure ограничивает область действия файла cookie "защищенными"
каналами (где "защищенный" определяется агентом пользователя). Если файл cookie
имеет атрибут Secure, пользовательский агент будет включать файл cookie
в HTTP-запрос только в том случае, если запрос передается по
защищенному каналу (обычно это HTTP по протоколу TLS).

источник: https://tools.ietf.org/html/rfc6265#section-4.1 .2.5

Браузеры могут не использовать файлы cookie на основе алгоритма, описанного в: https://tools.ietf.org/html/rfc6265#section-5.4

Попробуйте удалить Secure Attribute и посмотрите, поможет ли это

person chimurai    schedule 16.08.2016
comment
при переходе на http без безопасного флага я получаю сеанс. Означает ли это, что я не могу использовать https или безопасные файлы cookie с синхронизацией браузера? - person Avi; 18.08.2016
comment
Вы все еще можете. Просто включите опцию https в синхронизации браузера: browserSync({ https: true }); Таким образом, безопасный файл cookie, вероятно, не будет отклонен. - person chimurai; 19.08.2016

Ответ B.Ma дает мне подсказку, чтобы решить мою проблему с сервером webpack-dev, который, вероятно, использует http-proxy-middleware под капотом для проксирования запроса. Проблема связана с файлами cookie httpOnly, и этот подход решил ее. Вот мой конфиг, который я использовал в webpack.conf.js:

let myappSessionValidationCookie = '';

module.exports = {
    ...
    devServer: {
        publicPath: 'http://localhost:9000/',
        ...
        proxy: {
            '/api': {
                target: 'http://localhost/myapp',
                changeOrigin: true,
                onProxyReq: function (proxyReq) {
                    if (myappSessionValidationCookie) {
                        proxyReq.setHeader('cookie', myappSessionValidationCookie);
                    }
                },
                onProxyRes: function (proxyRes) {
                    const proxyCookie = proxyRes.headers['set-cookie'];
                    if (proxyCookie) {
                        myappSessionValidationCookie = proxyCookie;
                    }
                },
            },
        },
    },
});

Некоторое пояснение к конфигурации. У меня есть серверная часть, которая обслуживает API приложения под localhost/myapp/api/* и устанавливает файл cookie httpOnly, предназначенный для целей аутентификации. Этот заголовок (set-cookie) не был передан прокси-сервером в новое место (localhost:9000/myapp/api/*), поэтому браузер не сохраняет его, и все последующие запросы были без этого файла cookie и завершились неудачно. Все заслуги принадлежат B.Ma. Большое спасибо за пост!!!

person Stanimir Georgiev    schedule 27.07.2020

В моем случае работает настройка "cookieDomainRewrite": "localhost",. Это позволяет браузеру правильно настроить файлы cookie, поскольку домен будет соответствовать

Ниже полная конфигурация для setupProxy.js в React:

const {createProxyMiddleware} = require('http-proxy-middleware');

module.exports = function (app) {
    app.use(
        '/api',
        createProxyMiddleware({
            target: 'http://localhost:8000',
            changeOrigin: true,
            cookieDomainRewrite: "localhost",
        })
    );
};
person Mattia Fantoni    schedule 24.11.2020

// Set up the proxy.
if (dev) {
  const { createProxyMiddleware } = require('http-proxy-middleware')
  server.use(
    '/api',
    createProxyMiddleware({
      target: 'https://api.example.com/',
      changeOrigin: true,
      cookieDomainRewrite: 'localhost',
      // logLevel: 'debug',
    })
  )
}

Это моя конфигурация. думаю дело в том

cookieDomainRewrite: 'localhost',
person Alen Vlahovljak    schedule 19.04.2021