2012-04-24 3 views
8

Ich habe einen einfachen Express-basierten Node.js-Webserver, den ich für die Entwicklung einer JavaScript-Anwendung verwende. Ich richte den Server ein, um Node-http-Proxy zu verwenden, um API-Anforderungen, die die Anwendung an einen Jetty-Server stellt, der auf einer anderen Domäne und einem anderen Port ausgeführt wird, zu Proxy. Dieses Setup hat einwandfrei funktioniert, bis ich Probleme mit der Sitzungsverwaltung hatte.Fortbestehen einer Cookie-basierten Sitzung über Knoten-http-Proxy

Nach der Authentifizierung gibt der Anwendungsserver ein Cookie mit einem Authentifizierungs-Token zurück, das die Serversitzung darstellt. Wenn ich die JS-Anwendung von meinem Dateisystem aus starte (Datei: //), kann ich sehen, dass sobald der Client das Cookie erhält, es in allen folgenden API-Anfragen gesendet wird. Wenn ich die JS-App auf dem Knotenserver ausführe und API-Aufrufe über Knoten-http-Proxy (RoutingProxy) weitergeleitet werden, enthalten die Anforderungsheader niemals das Cookie.

Gibt es etwas, das ich manuell behandeln muss, um diese Art von Sitzungspersistenz über den Proxy zu unterstützen? Ich habe den Knoten-http-Proxy-Code durchforstet, aber es ist etwas über meinem Kopf, weil ich neu bei Node bin.

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

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

Antwort

5

Ich habe getan, was Sie fragen, indem Sie manuell auf die Antwort schauen, sehen, ob es ein Set-Cookie ist, die JSSESSIONID abschneidet, speichert sie in einer Variablen und übergibt sie an alle nachfolgenden Anfragen als Kopfzeile. Auf diese Weise fungiert der Reverse Proxy als Cookie.

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

Im Idealfall die Aufgabe eines Proxy ist nur vorwärts eine Anforderung an das Ziel und sollte nicht kritisch Header wie Cookies abzustreifen, aber wenn es ist, ich glaube, Sie Datei sollte ein Problem gegen sie hier https://github.com/nodejitsu/node-http-proxy/issues.

Auch Sie sagten, dass die Anfrage Header nie den Cookie enthalten, ist es möglich, der Client hat es nie erhalten?

+0

Ich habe im Web Inspector bestätigt, dass der Client den Header 'set-cookie' erhält. Sie können die Transaktion [hier] sehen (http://i.imgur.com/VQV0a.png).Der Anfragecookie wird in diesem Fall von Express's CookieParser erzeugt, den ich benutzen wollte, um die Sitzung zu unterstützen, aber es scheint immer sein eigenes Ding zu machen. – tomswift

+0

Ein Problem in GitHub wurde geöffnet, da ich mich bemühe, den Cookie aus der Antwort des Proxy-Servers zu holen und die Sitzung manuell zu unterstützen: https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

Ich habe einen Weg gefunden, dies zu implementieren, indem ich Knoten-http-Proxy abzweigen und modifizieren. Es dient meinem gegenwärtigen Zweck, der eine Entwicklungsumgebung ist. Für jede ernsthafte Überlegung muss es in eine legitimere Lösung ausgearbeitet werden.

Die Details kann ich in GitHub eingereicht in der Frage zu finden: https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

ich auf diese Lösung eine Eingabe lieben würde, vor allem, wenn ich völlig in die falsche Richtung gehe.

0

Hallo @tomswift nicht lokalen Server laufen auf HTTP-Protokoll, aber die Session-Cookie von dem Remote-Server carry erhalten mit Secure; wie:

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

Wenn ja, bevor Sie Ihren lokalen Server als Reaktion auf die Client, extrahieren Sie set-cookie aus der ursprünglichen Antwort (Antwort von Remote-Server auf lokalen Server) Header, entfernen Sie die Secure; und legen Sie den Rest in die Proxy-Antwort (Antwort vom lokalen Server auf Client) Header wie:

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

dann nimmt der Client den Session-Cookie automatisch.

Ich hoffe, es kann helfen.

Verwandte Themen