Amazon web services Node Express服务器无法在AWS ELB环境中设置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

我的Express应用程序中有一个中置,可在客户端浏览器中设置cookie:

 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被阻止