坚持在基于Cookie的会话节点-HTTP代理(Persisting a cookie based

2019-07-29 03:22发布

我有我使用了JavaScript的应用程序的开发一个简单的基于Node.js的快递网络服务器。 我设置的服务器使用节点HTTP代理到代理API请求的应用程序向被在不同的域和端口运行的Jetty服务器。 这种设置一直工作完美无缺,直到我开始跑与会话管理的问题。

经认证的应用服务器返回与代表服务器会话的身份验证令牌的cookie。 当我运行JS应用了我的文件系统(文件://)我可以看到,一旦客户端接收的cookie,它在所有后续API请求发送。 当我在节点服务器上运行的应用程序的JS和API调用都是通过节点-HTTP代理(RoutingProxy)代理请求头从不包括饼干。

有什么我需要手动处理通过代理来支持这种类型的会话持久性? 我已经挖通过节点的HTTP代理代码,但它是一点点在我头上,因为我是新来的节点。

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

Answer 1:

我做了你通过手动看反应,看它是否是一个Set-Cookie,剪断了JSESSSIONID,将其存储在一个变量,并通过它所有后续请求的头问。 通过这种方式,反向代理作为一个cookie。

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


Answer 2:

喜@tomswift确实HTTP协议的本地服务器上运行,但会话cookie从远程服务器接收携带Secure; 喜欢:

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

如果是这样,您的本地服务器响应客户端之前,提取set-cookie从原来的响应报头(从远程服务器到本地服务器的响应),除去Secure; 并把它的其余部分为代理响应(从本地服务器到客户端的响应)头部,如:

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

那么客户端将自动会话cookie。

希望对大家有所帮助。



Answer 3:

理想情况下,代理的工作是只是前进至目的地的请求,并且不应该剥离像饼干头的关键,但如果是这样,我想你应该提交的问题对他们在这里https://github.com/nodejitsu /节点HTTP代理/问题 。

另外你说的请求头从不包括饼干,是否有可能在客户端没有收到呢?



Answer 4:

我发现了一种通过派生和修改节点的HTTP代理来实现这一点。 它提供我目前的目标是一个开发环境。 对于任何形式的认真考虑它需要被充实到一个更合理的解决方案。

详情可我在GitHub上提出的问题中找到: https://github.com/nodejitsu/node-http-proxy/issues/236#issuecomment-5334457

我喜欢这个解决方案的一些输入,特别是如果我在错误的方向前进彻底。



Answer 5:

我有类似的问题,饼干都没有通过转发给客户端。 解:

  1. 得到代理响应的cookie
  2. 将其设置在代理请求,用稍微修改的值
let cookie;
const webpackConfig = {
  proxy: {
    '/api': {
        ...
        onProxyReq: (proxyReq) => {
          if(cookie) {
            proxyReq.setHeader('Cookie', cookie);
          }
        },
        onProxyRes: (proxyRes) => {
          const sc = proxyRes.headers['set-cookie'];

          const raw = sc.filter(s => s.startsWith('JSESSIONID'));

          if(raw.length) {
            cookie = raw[0].split(';')[0];
          }
        }

    }
  }
}


文章来源: Persisting a cookie based session over node-http-proxy