2012-04-24 6 views
8

Ho un semplice server web Node.js basato su Express che sto usando per lo sviluppo di un'applicazione JavaScript. Ho configurato il server in modo che utilizzi node-http-proxy per le richieste API proxy che l'applicazione esegue su un server Jetty in esecuzione su un dominio e una porta diversi. Questa configurazione ha funzionato perfettamente fino a quando ho iniziato a incontrare problemi con la gestione delle sessioni.Persistenza di una sessione basata su cookie su node-http-proxy

Dopo l'autenticazione, il server delle applicazioni restituisce un cookie con un token di autenticazione che rappresenta la sessione del server. Quando eseguo l'applicazione JS al di fuori del mio filesystem (file: //), posso vedere che una volta che il client riceve il cookie, viene inviato in tutte le successive richieste API. Quando eseguo l'app JS sul server nodo e le chiamate API vengono inoltrate tramite nodo-http-proxy (RoutingProxy), le intestazioni delle richieste non includono mai il cookie.

C'è qualcosa che devo gestire manualmente per supportare questo tipo di persistenza di sessione attraverso il proxy? Sto scavando attraverso il codice del nodo-http-proxy, ma è un po 'sopra la mia testa perché sono nuovo di Nodo.

https://gist.github.com/2475547 o:

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); 

risposta

5

Ho fatto quello che stai chiedendo esaminando manualmente la risposta, verificando se si tratta di un set-cookie, eliminando JSESSSIONID, memorizzandolo in una variabile e trasmettendolo su tutte le richieste successive come intestazione. In questo modo il proxy inverso funge da cookie.

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

Idealmente il lavoro di un proxy è di appena avanti una richiesta alla destinazione, e non deve togliere le intestazioni critici come i biscotti, ma se lo è, penso che si dovrebbe file un problema contro di loro qui https://github.com/nodejitsu/node-http-proxy/issues.

Inoltre hai detto che le intestazioni delle richieste non includono mai il cookie, è possibile che il cliente non lo abbia mai ricevuto?

+0

Ho confermato in Web Inspector che il client riceve l'intestazione 'set-cookie'. Puoi vedere la transazione [qui] (http://i.imgur.com/VQV0a.png).Il cookie di richiesta in questo caso viene generato dal cookieParser di Express che stavo cercando di utilizzare per supportare la sessione ma sembra che faccia sempre le sue cose. – tomswift

+0

Inaugurato un problema in GitHub mentre faccio fatica a provare ad ottenere il cookie dalla risposta del server proxy e a supportare manualmente la sessione: https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

Ho trovato un modo per implementare questa operazione mediante la foratura e la modifica di node-http-proxy. Serve al mio scopo attuale che è un ambiente di sviluppo. Per qualsiasi tipo di considerazione seria deve essere concretizzato in una soluzione più legittima.

I dettagli possono essere trovati nella questione ho presentato in GitHub: https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

mi piacerebbe qualche input su questa soluzione, soprattutto se sto andando completamente nella direzione sbagliata.

0

Hi @tomswift fa la corsa server locale su protocollo http, ma il cookie di sessione ricevere dal carry server remoto con Secure; come:

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

Se è così, prima della risposta del server locale al cliente, estrarre set-cookie dalla risposta originale (risposta dal server remoto al server locale) un colpo di testa, togliere la Secure; e mettere il resto in risposta proxy (risposta dal server locale per client) un colpo di testa come:

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

quindi il client prenderà automaticamente il cookie di sessione.

Spero che possa essere d'aiuto.