Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js http代理中间件“;设置cookie";浏览器中未设置响应_Node.js_Express_Cookies_Proxy_Http Proxy Middleware - Fatal编程技术网

Node.js http代理中间件“;设置cookie";浏览器中未设置响应

Node.js http代理中间件“;设置cookie";浏览器中未设置响应,node.js,express,cookies,proxy,http-proxy-middleware,Node.js,Express,Cookies,Proxy,Http Proxy Middleware,我曾尝试查看过去对此类问题的回应,例如以下,但它们都会引发各种错误: 我的代理安装程序返回正确的响应头并设置cookie:设置cookie:JSESSIONID=yElsHUaPE8Ip_AAD_oIfTQ;路径=/;保护HttpOnly。这些不是会话cookie 但是,我的登录正式失败,因为JSESSIONID没有存储为cookie 以下是我的代理设置: const proxyTable = { "/url": "http://localhost:4040/url", "pr

我曾尝试查看过去对此类问题的回应,例如以下,但它们都会引发各种错误:

我的代理安装程序返回正确的
响应头
并设置cookie:
设置cookie:JSESSIONID=yElsHUaPE8Ip_AAD_oIfTQ;路径=/;保护HttpOnly。这些不是会话cookie

但是,我的登录正式失败,因为
JSESSIONID
没有存储为cookie

以下是我的代理设置:

const proxyTable = {
  "/url": "http://localhost:4040/url",
  "proxy.url.com/": "http://localhost:4040/",
};

const signin_proxy_options = {
  target: host,
  autoRewrite: true,
  secure: true,
  reqBodyEncoding: null,
  changeOrigin: true,
  logLevel: "debug",
  router: proxyTable,
  protocolRewrite: "http",
  cookieDomainRewrite: { "*": "" },
  onProxyRes: function(proxyRes, req, res) {
    if (proxyRes.headers["set-cookie"] !== undefined) {
      console.log("** SET-COOKIE: ", proxyRes.headers["set-cookie"]);

      const cookieJar = proxyRes.headers["set-cookie"];
      // cookieJar = 'JSESSIONID=yElsHUaPE8Ip_AAD_oIfTQ; Path=/; Secure; HttpOnly;'
      var temp = cookieJar.split(";")[0].split("=");
      // temp = [ 'JSESSIONID', 'yElsHUaPE8Ip_AAD_oIfTQ' ]
      res.cookie(temp[0], temp[1]);
    }
  },
};

// Proxy configuration
const signin_proxy = proxy(signin_filter, signin_proxy_options);
app.use("/signin", signin_proxy);

成功时,服务器返回一个
302
以重定向。这会有影响吗??这就是为什么我有proxyTable的原因

另外,由于看起来响应正常,我删除了
onProxyRes
字段,希望它能自动设置,但也没有运气


我很欣赏任何想法/解决方案。

我不确定这是否是最佳做法,但JSESSIONID cookie似乎不喜欢使用
安全
标志存储。这是我更新的代理选项:

const signin_proxy_options = {
  target: host,
  autoRewrite: true,
  secure: true,
  changeOrigin: true,
  logLevel: "debug",
  protocolRewrite: "http",
  onProxyRes: function(proxyRes, req, res) {
    if (proxyRes.headers["set-cookie"] !== undefined) {
      proxyRes.headers["set-cookie"] = proxyRes.headers[
        "set-cookie"
      ][0].replace("Secure; ", ""); // JSESSIONID cookie cannot be set thru proxy with Secure
      return proxyRes;
    }
  },
};

请记住,从cookie中删除安全标志意味着它可以通过非https连接使用!如果您的cookie包含身份验证令牌,则这是个坏消息。任何有能力查看其流量的人(例如,咖啡店wi-fi上的数据包嗅探器)都将能够查看该cookie,提取令牌,然后像用户一样执行操作。安全标志存在是有原因的!如果cookie设置为“安全”,则需要使用HTTPS提供到代理的连接,以便设置cookie。通常,如果您在开发中运行,您将不会使用HTTPS,除非您使用的是自签名证书或类似ngrok的服务。一个解决方案可能是仅在开发阶段删除“安全”标志,并在观众通过HTTPS连接时将其保留在生产阶段。