2012-04-24 4 views
8

У меня есть простой веб-сервер Node.js на основе Express, который я использую для разработки приложения JavaScript. Я настроил сервер для использования node-http-proxy для прокси-запросов API, которые приложение делает на сервере Jetty, который работает в другом домене и порту. Эта настройка работает безупречно, пока я не столкнулся с проблемами управления сеансом.Сохранение сеанса на основе файлов cookie над узлом-http-proxy

После аутентификации сервер приложений возвращает куки-файл с токеном аутентификации, представляющим сеанс сервера. Когда я запускаю приложение JS из своей файловой системы (файл: //), я вижу, что как только клиент получает файл 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); 

ответ

5

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

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

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

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

+0

Я подтвердил в веб-инспекторе, что клиент получает заголовок «set-cookie». Вы можете увидеть транзакцию [здесь] (http://i.imgur.com/VQV0a.png).Файл cookie запроса в этом случае генерируется cookieParser Express, который я пытался использовать для поддержки сеанса, но он, кажется, всегда делает свое дело. – tomswift

+0

Открыл проблему в GitHub, пытаясь попытаться получить cookie с ответа прокси-сервера и вручную поддерживать сеанс: https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

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

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

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

0

Привет @tomswift ли локальный запуск сервера по протоколу HTTP, но куки сессии получить от переноса удаленного сервера с Secure; как:

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

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

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

, то клиент автоматически примет сеансовый файл cookie.

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