保存Ajax但不将CORS cookie从127.0.0.1发送到服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存Ajax但不将CORS cookie从127.0.0.1发送到服务相关的知识,希望对你有一定的参考价值。

所以我一直在向服务发送带有跨域请求的cookie时遇到问题。我已经让它在我们的CI环境中工作,但不是在本地。基本上,我在api.service.com有一个API,它可以通过从webapp.service.com的客户端运行的AJAX调用来访问。 API通过.service.comset-cookie设置cookie。然后,对API的所有后续调用都应包含此cookie。当从webapp.service.com运行时,这可以按预期工作。这将在prod工作正常。但是,出于显而易见的原因,我希望能够在本地开发webapp,并从本地文件或api.service.com服务对localhost运行API调用。

我知道Chrome在保存本地文件的cookie方面有点不确定,但我已经解决了这个问题,而且不是问题。实际上,cookie是节省的。它只是不发送带有后续API调用的cookie。这是我正在进行的工作流程(带有一些通用/审查的产品名称):

一个AJAX调用POSTS到我们的API:

$.ajax({
  method: "POST",
  crossDomain: true,
  xhrFields: {
    withCredentials: true,
  },
  url: 'https://api.service.com/login',
  data: data,
  contentType:"text/plain",
  dataType: "json",
  success: function(data){
    ...
  }
});

CORS的东西设置为允许凭证和这个来源(动态允许的原始更新,不使用*。所以我们得到这个cookie:cookie:service-token=7f7d251ebeec37f7c0815....; SameSite=lax;Max-Age=2629744; domain=.service.com; path=/;

它在Chrome中显示如下:

Request cookie

我知道这实际上可以保存cookie。但是,也许不是我想要的。我进入Chrome的Cookie,它会正常更新,如下所示:

Chrome saved cookie

我看到的问题是它的“发送”值是“仅限同一站点连接”。我不知道如何最初设置Chrome以将其视为“任何类型的连接”。我认为这就是当我发送另一个AJAX调用时,该cookie未包含在请求中的原因。

我已经看到这样的其他帖子通过在AJAX调用中添加crossDomain和/或withCredentials来解决。这对我没有解决。这是对API的后续调用:

$.ajax({
  url: 'https://api.service.com/getTheThing',
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  },
  success: function(data){...}
});

cookie不包含在此请求中,因此失败。

答案

事实证明,设置SameSite=lax正好与我的想法相反。删除它解决了这个问题。

以上是关于保存Ajax但不将CORS cookie从127.0.0.1发送到服务的主要内容,如果未能解决你的问题,请参考以下文章

Cors 没有物理保存 cookie

我如何使用httplib2上传图像,但不将其保存到计算机上?

如何跨域传递 cookie

IIS ajax CORS 访问发送自定义Header时分析

浏览器不保存从CORS请求获取的身份验证cookie

为 NSManagedObject 创建实例但不将其保存到上下文中