2016-09-30 2 views
6

Ich habe derzeit einen Server mit Spring in einem Tomcat-Servlet mit Shiro Token-System für die Überprüfung, ob ein Benutzer bereits angemeldet ist. Es ermöglicht domainübergreifende Anfragen.Reverse-Proxy-Login mit Anmeldeinformationen von node.js

In jeder anderen Domain ich auf dem Client kann (in der Regel unter Verwendung von Winkeln) call ...

http.get('https://<my_check_login_service>', {withCredentials: true})

... und so lange, wie ich bereits angemeldet bin (Token läuft nicht ab) gib die Benutzerinformationen zurück (Name, Avatar, etc.).

Ich habe jetzt ein anderes System, dass ein Knoten-Server (auch Winkel für die Client-Seite dient, nach oben), für die ich den Knotenserver aufrufen möchte und haben es Proxy über dem oben my_check_login_service den Benutzer zu erhalten, Legen Sie Informationen zum Sitzungsobjekt fest (mithilfe von express), und geben Sie dann den Benutzer an den Client zurück. Aber erlauben Sie mir auch, über das Sitzungsobjekt ihrer Verbindung zu vertrauen und ihnen zu erlauben, weitere API-Aufrufe auszuführen, abhängig von der Sicherheitsstufe des Benutzers, die vom Login-Dienst zurückgegeben wurde.

Auf dem node.js Router kann ich Proxy dies zu tun ...

app.get('/checklogin', function(req, res) { 
    req.pipe(request.get("https://<my_check_login_service>").pipe(res); 
} 

... aber ich weiß nicht, wie die richtigen Anmeldeinformationen an den Dienst zu übergeben. Wenn ich das tue ...

http.get('checkLogin', {withCredentials: true})

... es ist natürlich nicht funktioniert, weil die Anmeldeinformationen für meinen login_service nicht an dem lokalen Server gesendet werden. Wie kann ich die richtigen Anmeldeinformationen weitergeben, damit dies funktioniert?

Prost.

app.get('/checklogin', function(req, res) { 
    console.dir(req.headers) 
    //You can inspect the headers here and pass only required values 
    const options = { 
    url: 'https://<my_check_login_service>', 
    headers: Object.assign(
     //Tell the login service about address of original request 
     {'X-Forwarded-For': req.connection.remoteAddress} 
     req.headers) 
    } 
    req.pipe(request.get(options)) 
    .on('response', (response) => res.set(response.headers)) 
    .pipe(res) 
} 

Dieses Beispiel geht ursprüngliche Adresse:

Antwort

2

Credentials höchstwahrscheinlich in den HTTP-Header sind, alle Header vorbei (beide von Anfrage und Antwort), mit der Adresse des ursprünglichen Anforderung, sollte es funktioniert Einstellung X-Forwarded-For, login_service kann es erkennen ... oder nicht, je nach Konfiguration.

+0

Ja! Vielen Dank! Ich bin mir nicht ganz sicher, ob es funktionieren wird, weil ich jetzt weiß, dass ich wahrscheinlich ein Wildcard-Zertifikat brauche, damit es für mich funktioniert. Aber mit dieser Änderung bekomme ich jetzt "Fehler: Hostname/IP stimmt nicht mit den alternativen Namen des Zertifikats überein: ..." Ich gehe davon aus, dass ein Wildcard-Zertifikat das beheben wird. Wird dies aktualisieren, wenn ich das Quadrat entfernt habe. – crowmagnumb

+0

'login_service' überprüft auch die Client-IP-Adresse, daher sollte der Proxy diese übergeben. Ich füge das zur Antwort hinzu – DarkKnight

+0

Leider funktioniert das nicht. Durch das Hinzufügen der Header können dem Server zumindest einige Informationen mitgeteilt werden, die für die Anmeldung erforderlichen Sicherheitstoken werden jedoch nicht übergeben. Ich denke, was ich machen möchte, ist unmöglich und ich muss nur ein OAuth-System implementieren. Wenn ich keine anderen Antworten bekomme, bevor das Kopfgeld abläuft, werde ich es dir sicher geben. Vielen Dank. :) – crowmagnumb

Verwandte Themen