Javascript http代理中间件,如何复制所有/cookie头
我正在使用John Papa的lite服务器和chimurai的HTTP代理中间件 作为开发服务器。 问题在于我的会话cookie,我无法持久化来自真实服务器的会话cookie。 我看到了这个解决方案: 但我看不出与我的bs-config.js有什么相似之处:Javascript http代理中间件,如何复制所有/cookie头,javascript,angular,http-proxy,browser-sync,lite-server,Javascript,Angular,Http Proxy,Browser Sync,Lite Server,我正在使用John Papa的lite服务器和chimurai的HTTP代理中间件 作为开发服务器。 问题在于我的会话cookie,我无法持久化来自真实服务器的会话cookie。 我看到了这个解决方案: 但我看不出与我的bs-config.js有什么相似之处: var proxy = require('http-proxy-middleware'); module.exports = { port: 3003, server: { middleware: {
var proxy = require('http-proxy-middleware');
module.exports = {
port: 3003,
server: {
middleware: {
1: proxy('demo/webservice/jaxrs', {
target: 'https://localhost:8443',
secure: false, // disable SSL verification
changeOrigin: true // for vhosted sites, changes host header to match to target's host
}),
2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
}
}
};
有人知道如何合并这两者吗
更新:这是响应标题的一部分:
set-cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3; Path=/appServer/webservice/jaxrs; Secure
strict-transport-security:max-age=31622400; includeSubDomains
Transfer-Encoding:chunked
更新2:
我认为我的配置应该如下所示:
var proxy = require('http-proxy-middleware');
function relayRequestHeaders(proxyReq, req) {
Object.keys(req.headers).forEach(function (key) {
proxyReq.setHeader(key, req.headers[key]);
});
};
function relayResponseHeaders(proxyRes, req, res) {
Object.keys(proxyRes.headers).forEach(function (key) {
res.append(key, proxyRes.headers[key]);
});
};
module.exports = {
port: 3003,
server: {
middleware: {
1: proxy('/skybox', {
target: 'https://localhost:8443',
secure: false, // disable SSL verification
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
onProxyReq: relayRequestHeaders,
onProxyRes: relayResponseHeaders
}),
2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
}
}
};
但是现在res.append是未定义的:(不确定本地主机:3003是如何配置的;使用或不使用
https:
假设您正在使用(不是https:);
目标中的Secure
cookie属性可能是浏览器忽略cookie的原因
4.1.2.5.安全属性
Secure属性将cookie的范围限制为“Secure”通道(其中“安全”由用户代理定义)。当 cookie具有安全属性,用户代理将包括 HTTP请求中的cookie,仅当请求通过
安全通道(通常为传输层安全性(TLS)上的HTTP) 资料来源: 浏览器可能会根据以下所述的算法忽略cookie: 尝试删除
安全属性
,看看这是否有帮助尝试一下:
var cookie;
function relayRequestHeaders(proxyReq, req) {
if (cookie) {
proxyReq.setHeader('cookie', cookie);
}
};
function relayResponseHeaders(proxyRes, req, res) {
var proxyCookie = proxyRes.headers["set-cookie"];
if (proxyCookie) {
cookie = proxyCookie;
}
};
它与lite server一起工作。B.Ma的回答给我一个提示,以解决我与webpack dev server的问题。webpack dev server可能在引擎盖下使用http代理中间件代理请求。该问题与httpOnly Cookie一起出现,此方法解决了该问题。 这是我在webpack.conf.js中使用的配置:
let myappSessionValidationCookie = '';
module.exports = {
...
devServer: {
publicPath: 'http://localhost:9000/',
...
proxy: {
'/api': {
target: 'http://localhost/myapp',
changeOrigin: true,
onProxyReq: function (proxyReq) {
if (myappSessionValidationCookie) {
proxyReq.setHeader('cookie', myappSessionValidationCookie);
}
},
onProxyRes: function (proxyRes) {
const proxyCookie = proxyRes.headers['set-cookie'];
if (proxyCookie) {
myappSessionValidationCookie = proxyCookie;
}
},
},
},
},
});
关于配置的一些解释。我有一个后端,它在localhost/myapp/api/*下为应用程序的api提供服务,并设置一个用于身份验证的httpOnly cookie。代理未将该标头(set cookie)传输到新位置(localhost:9000/myapp/api/*)因此,浏览器没有保留该cookie,并且以下所有请求都没有该cookie,因此失败。
所有的学分都归B.Ma。非常感谢您的帖子!!!在我的案例中设置“cookieDomainRewrite”:“localhost”
有效。这允许浏览器正确设置Cookie,因为域将匹配
下面是React中setupProxy.js
的完整配置:
const {createProxyMiddleware} = require('http-proxy-middleware');
module.exports = function (app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:8000',
changeOrigin: true,
cookieDomainRewrite: "localhost",
})
);
};
这是我的配置。我认为重点在于
cookieDomainRewrite: 'localhost',
您可以提供来自目标的原始响应吗?原始响应中的
set cookie
值是多少?我更新了我的原始帖子。这是会话cookie:set cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3;Path=/appServer/webservice/jaxrs;secure您还可以提供正在向端口3003上的服务器发出的原始请求吗?I我使用CreateReact应用程序,当我使用代理中间件时,我只获得部分身份验证令牌(大小减小)有什么原因吗?在没有安全标志的情况下移动到http时,我确实获得了会话。这是否意味着我不能将https或安全Cookie与浏览器同步一起使用?您仍然可以。只需在浏览器同步中启用https
选项:browserSync({https:true});
这样,安全cookie可能不会被拒绝。感谢您的提示,它解决了我在nodejs和http代理中间件中遇到的类似问题
cookieDomainRewrite: 'localhost',