通过node-http-proxy持久基于cookie的会话

我有一个简单的基于Express的Node.js Web服务器,用于开发JavaScript应用程序。 我将服务器设置为使用node-http-proxy来代理应用程序对运行在不同域和端口上的Jetty服务器的API请求。 直到我开始遇到会话pipe理问题时,此设置一直在完美运行。

在authentication之后,应用服务器返回一个带有代表服务器会话的authentication令牌的cookie。 当我从我的文件系统(file://)运行JS应用程序时,我可以看到,一旦客户端收到cookie,就会在所有后续的API请求中发送。 当我在节点服务器上运行JS应用程序,并通过node-http-proxy(RoutingProxy)代理API调用时,请求标头永远不会包含cookie。

有什么我需要手动处理,以支持通过代理这种types的会话持久性? 我一直在挖掘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); 

我是通过手动查看响应来做的,看看它是否是一个set-cookie,剪掉JSESSSIONID,将它存储在一个variables中,然后把它作为一个头部传递给所有的后续请求。 这样反向代理就像一个cookie。

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

理想情况下,代理的工作就是将请求转发到目的地,不应该删除像cookies这样的重要头文件。但如果是这样的话,我认为你应该在这里提出一个问题对他们来说https://github.com/nodejitsu / node-http-proxy /问题 。

你也说过请求头文件不包含cookie,是否有可能客户端没有收到它?

我find了一种通过分叉和修改node-http-proxy来实现的方法。 它服务于我目前的开发环境。 对于任何forms的认真考虑,都需要充实到更合理的解决scheme中去。

细节可以在我提交给GitHub的问题中find: https : //github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

我会喜欢这个解决scheme的一些input,特别是如果我完全走错了方向。

Hi @ tomswift你的本地服务器是否运行在http协议上,但是会话cookie从远程服务器接收到的是Secure; 喜欢:

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

如果是这样,在本地服务器响应客户端之前,从原始响应(从远程服务器到本地服务器的响应)头中提取set-cookie ,移除Secure; 并将其余部分放入代理响应(本地服务器到客户端的响应)中,如下所示:

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

那么客户端会自动获取会话cookie。

希望它可以帮助。