2012-04-24 19 views
8

Tengo un servidor web basado en Express simple Node.js que estoy usando para el desarrollo de una aplicación de JavaScript. Configuré el servidor para utilizar node-http-proxy para las solicitudes de API proxy que realiza la aplicación a un servidor Jetty que se ejecuta en un dominio y puerto diferentes. Esta configuración ha funcionado perfectamente hasta que comencé a tener problemas con la administración de la sesión.Persistencia de una sesión basada en cookies sobre node-http-proxy

Tras la autenticación, el servidor de aplicaciones devuelve una cookie con un token de autenticación que representa la sesión del servidor. Cuando ejecuto la aplicación JS fuera de mi sistema de archivos (archivo: //), puedo ver que una vez que el cliente recibe la cookie, se envía en todas las solicitudes posteriores de la API. Cuando ejecuto la aplicación JS en el servidor de nodo y las llamadas a la API se procesan a través del nodo-http-proxy (RoutingProxy), los encabezados de solicitud nunca incluyen la cookie.

¿Hay algo que necesite manejar manualmente para admitir este tipo de persistencia de sesión a través del proxy? He estado investigando el código de nodo-http-proxy pero está un poco sobre mi cabeza porque soy nuevo en Node.

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

Respuesta

5

Hice lo que estaba preguntando mirando manualmente la respuesta, viendo si se trata de un conjunto de cookies, cortando el JSESSSIONID, almacenándolo en una variable y pasándolo en todas las solicitudes posteriores como encabezado. De esta forma, el proxy inverso actúa como una cookie.

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

Lo ideal sería que el trabajo de un proxy es simplemente presentar una solicitud al destino, y no deben quitarse los encabezados críticos como las galletas, pero si lo es, creo que debería presentar un problema contra ellos aquí https://github.com/nodejitsu/node-http-proxy/issues.

También ha dicho que los encabezados de las solicitudes nunca incluyen la cookie, ¿es posible que el cliente nunca la haya recibido?

+0

He confirmado en Web Inspector que el cliente recibe el encabezado 'set-cookie'. Puede ver la transacción [aquí] (http://i.imgur.com/VQV0a.png).La cookie de solicitud en este caso está siendo generada por el cookieParser de Express que estaba tratando de usar para apoyar la sesión, pero parece que siempre hace lo suyo. – tomswift

+0

Se ha abierto un problema en GitHub porque me cuesta tratar de obtener la cookie de la respuesta del servidor proxy y apoyar manualmente la sesión: https://github.com/nodejitsu/node-http-proxy/issues/236 – tomswift

0

Encontré una manera de implementar esto bifurcando y modificando node-http-proxy. Sirve a mi propósito actual, que es un entorno de desarrollo. Para cualquier clase de consideración seria necesita ser desarrollada en una solución más legítima.

Los detalles se pueden encontrar en la edición presenté en GitHub: https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

me gustaría alguna entrada en esta solución, especialmente si voy por completo en la dirección equivocada.

0

Hola @tomswift funciona su carrera servidor local en el protocolo http, pero la cookie de sesión reciben del equipaje de servidor remoto con Secure; como:

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

Si es así, antes de que su respuesta del servidor local al cliente, extraiga set-cookie del encabezado de respuesta original (respuesta del servidor remoto al servidor local), elimine el Secure; y coloque el resto en el encabezado de respuesta del proxy (respuesta del servidor local al cliente) como:

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

luego el cliente tomará la cookie de sesión automáticamente.

Espero que pueda ayudar.

Cuestiones relacionadas