Amazon web services Node Express服务器无法在AWS ELB环境中设置cookie
我的Express应用程序中有一个中置,可在客户端浏览器中设置cookie:Amazon web services Node Express服务器无法在AWS ELB环境中设置cookie,amazon-web-services,express,cookies,cross-domain,aws-application-load-balancer,Amazon Web Services,Express,Cookies,Cross Domain,Aws Application Load Balancer,我的Express应用程序中有一个中置,可在客户端浏览器中设置cookie: res.cookie('token', '123'); 所有功能在本地环境中都能完美运行,前端调用本地服务器: axios .post(`http://localhost:3000/createSomething`, { 'field': "value"}) .then(res => { console.log('res', res) }) .catch(err
res.cookie('token', '123');
所有功能在本地环境中都能完美运行,前端调用本地服务器:
axios
.post(`http://localhost:3000/createSomething`, { 'field': "value"})
.then(res => {
console.log('res', res)
})
.catch(err => {
return Promise.reject(
new Error('There is an issue with the /createSomething endpoint')
);
});
在这种情况下,cookie将被设置,我可以在Cookies部分下的我的开发工具中看到它。问题是当我将前端调用更改为指向AWS Elastic Beanstalk环境时:
http://localhost:3000/createSomething ->
调用成功,但在客户端浏览器中未创建cookie。尽管如此,在响应标题中我确实看到:
set-cookie: paigetoken=123; Path=/
一些进一步的细节:
- 集合cookie的末尾有一个黄色警告符号
- 使用CORS
- AWS环境中有一个处理https的应用程序负载平衡器。这可能是一个因素吗
如何解决此问题并使AWS ELB环境中的Express应用程序在客户端浏览器中成功设置cookie?如有任何见解,将不胜感激 您需要通过
SameSite=None;安全
并将cookie信息设置为set cookie:paigetoken=123;路径=/;SameSite=无;安全
Chrome不允许在不使用SameSite
选项的情况下从域设置cookie
PS:当请求来自本地环境时,此选项将被忽略。(localhost/127.0.0.1)
在NodeJs中,它将像这样工作
res.cookie('token', '123', { sameSite: 'None', path: '/', secure: true })
这里有一些参考:
您需要传递
SameSite=None;安全
并将cookie信息设置为set cookie:paigetoken=123;路径=/;SameSite=无;安全
Chrome不允许在不使用SameSite
选项的情况下从域设置cookie
PS:当请求来自本地环境时,此选项将被忽略。(localhost/127.0.0.1)
在NodeJs中,它将像这样工作
res.cookie('token', '123', { sameSite: 'None', path: '/', secure: true })
这里有一些参考:
1.更改请求URL:
由于我不完全确定您的环境是如何设置的,问题可能是客户端正在从localhost
请求信息,这意味着它将从同一台机器的客户端请求数据。尝试将客户端代码中的URL更改为:
`${location.origin}/createSomething`
2.如果这不起作用:
这在大多数浏览器中都会出现安全问题。想象一下,一个恶意站点覆盖了谷歌的登录令牌cookie。为了让服务器设置cookie,location.origin
必须在客户端和请求的端点中匹配
您可以使用的一种解决方法是让服务器发送响应,告诉客户端在前端设置cookie
例如:在服务器上,您可以执行类似的操作来发送包含cookie信息的头
res.set('X-SetCookie',JSON.stringify({name:“token”,value:“123”}));
然后在客户机中,使用类似这样的方法来实际设置cookie
axios
.邮政(`http://localhost:3000/createSomething`,{“字段”:“值”})
。然后(res=>{
//设置cookie函数。
函数setCookie({name,value,expires=1000*60*60*24*365}){
常数时间=新日期();
time.setTime(time.getTime()+过期);
document.cookie=`${name}=${value};expires=${time.toutString()};path=/`;
}
//如果响应具有X-SetCookie头,则设置cookie客户端。
if(res.headers.hasOwnProperty(“X-SetCookie”))SetCookie(JSON.parse(res.headers[“X-SetCookie”));
console.log('res',res)
})
只需确保正确配置CORS,以便浏览器可以看到标题:1。更改请求URL:
由于我不完全确定您的环境是如何设置的,问题可能是客户端正在从localhost
请求信息,这意味着它将从同一台机器的客户端请求数据。尝试将客户端代码中的URL更改为:
`${location.origin}/createSomething`
2.如果这不起作用:
这在大多数浏览器中都会出现安全问题。想象一下,一个恶意站点覆盖了谷歌的登录令牌cookie。为了让服务器设置cookie,location.origin
必须在客户端和请求的端点中匹配
您可以使用的一种解决方法是让服务器发送响应,告诉客户端在前端设置cookie
例如:在服务器上,您可以执行类似的操作来发送包含cookie信息的头
res.set('X-SetCookie',JSON.stringify({name:“token”,value:“123”}));
然后在客户机中,使用类似这样的方法来实际设置cookie
axios
.邮政(`http://localhost:3000/createSomething`,{“字段”:“值”})
。然后(res=>{
//设置cookie函数。
函数setCookie({name,value,expires=1000*60*60*24*365}){
常数时间=新日期();
time.setTime(time.getTime()+过期);
document.cookie=`${name}=${value};expires=${time.toutString()};path=/`;
}
//如果响应具有X-SetCookie头,则设置cookie客户端。
if(res.headers.hasOwnProperty(“X-SetCookie”))SetCookie(JSON.parse(res.headers[“X-SetCookie”));
console.log('res',res)
})
只需确保正确配置CORS,以便浏览器可以看到标题:“黄色警告”-是否有带有警告图标的消息?“由于用户偏好,此集Cookie被阻止”(Chrome)你确定没有任何广告拦截器或其他东西可以阻止浏览器中的cookie吗?我无法控制客户端浏览器和广告拦截器,因此我正在寻找一种独立于浏览器设置的解决方案。另外要注意的是,该问题不是在本地出现的。它似乎更像是CORS/AWS问题“黄色警告”“-是否有任何带有警告图标的消息?”由于用户偏好,此集Cookie被阻止