Сохранение сеанса на основе cookie через node-http-proxy

У меня есть простой узел на основе Express.JS веб-сервер, который я использую для разработки приложения JavaScript. Я настроил сервер для использования node-http-proxy для запросов API прокси-сервера, которые приложение делает к серверу причала, работающему на другом домене и Порту. Эта настройка работала безупречно, пока я не начал сталкиваться с проблемами с управлением сеансами.

при проверке подлинности сервер приложений возвращает файл cookie с маркером аутентификации, представляющим сервер сессия. Когда я запускаю приложение JS из своей файловой системы (file://), я вижу, что как только клиент получает cookie, он отправляется во всех последующих запросах API. Когда я запускаю приложение JS на сервере узла, и вызовы API проксируются через node-http-proxy (RoutingProxy), заголовки запросов никогда не включают cookie.

есть ли что-то, что мне нужно обработать вручную, чтобы поддержать этот тип сохранения сеанса через прокси? Я копался в коде node-http-proxy, но это немного выше моей головы, потому что я новичок в Node.

https://gist.github.com/2475547 или:

var express = require('express'),
    routingProxy = require('http-proxy').RoutingProxy(),
    app = express.createServer();

var apiVersion = 1.0,
    apiHost = my.host.com,
    apiPort = 8080;

function apiProxy(pattern, host, port) {
    return function(req, res, next) {
        if (req.url.match(pattern)) {
            routingProxy.proxyRequest(req, res, {host: host, port: port});
        } else {
            next();
        }
    }
}

app.configure(function () {
    // API proxy middleware
    app.use(apiProxy(new RegExp('/' + apiVersion + '/.*'), apiHost, apiPort));

    // Static content middleware
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(express.static(__dirname));
    app.use(express.errorHandler({
        dumpExceptions: true, 
        showStack: true
    }));
    app.use(app.router);
});

app.listen(3000);

4 ответов


Я сделал то, что вы просите, вручную посмотрев на ответ, увидев, является ли это set-cookie, отсекая jsessionid, сохраняя его в переменной и передавая его на все последующие запросы в качестве заголовка. Таким образом, обратный прокси-сервер действует как cookie.

enter code on('proxyReq', function(proxyReq){ proxyReq.setHeader('cookie', 'sessionid=' + cookieSnippedValue) 

Hi @tomswift делает ваш локальный сервер работать по протоколу http, но cookie сеанса получить от удаленного сервера нести с Secure; как:

'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;Secure;']

если да, то перед ответом локального сервера клиенту извлеките set-cookie из заголовка исходного ответа(ответ с удаленного сервера на локальный сервер) удалите Secure; и поместите остальную часть в заголовок ответа прокси (ответ от локального сервера клиенту), например:

'set-cookie':
[ 'JSESSIONID=COOKIEWITHSECURE98123; Path=/;HttpOnly;']

клиент автоматически cookie сеанса.

надеюсь, это может помочь.


В идеале задача прокси-сервера заключается в том, чтобы просто переслать запрос в пункт назначения и не удалять критические заголовки, такие как cookies, но если это так, я думаю, вы должны подать вопрос против них здесьhttps://github.com/nodejitsu/node-http-proxy/issues.

также вы сказали, что заголовки запросов никогда не включают cookie, возможно ли, что клиент никогда не получал его?


Я нашел способ реализовать это путем разветвления и изменения node-http-proxy. Это служит моей текущей цели, которая является средой разработки. Для любого серьезного рассмотрения он должен быть конкретизирован в более законное решение.

подробности можно найти в выпуске, который я подал в GitHub:https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

Я хотел бы внести свой вклад в это решение, особенно если я собираюсь совершенно не в том направлении.