MobileSafari不会发回由CORS设置的Cookie

我在MobileSafari中加载了一个页面,通过CORS与另一台服务器进行通信。

在桌面浏览器(经过testing的Chrome和Safari)中,我可以login,获取会话cookie,并将该会话cookie发回给后续请求,以便我可以通过所有API调用进行身份validation。

但是,当我通过Mobile Safarilogin时,Cookie不会在后续请求中发回。

我使用Charles Proxy来监视发生了什么,它告诉我:

  1. POST https://myremoteserver.com/sessions.json传递我的login信息
  2. 它成功,并收到一个有效的Set-Cookie头的响应。
  3. 请求GET https://myremoteserver.com/checkout.json ,没有Cookie请求头。
  4. 服务器响应,如果我没有login。

我在Zepto.js使用这段代码来确保在XHR对象上正确设置withCredentials: true 。 (赦免咖啡)

 # Add withCredentials:true to the xhr object to send the remote server our cookies. xhrFactory = $.ajaxSettings.xhr $.ajaxSettings.xhr = -> xhr = xhrFactory.apply(this, arguments) xhr.withCredentials = yes xhr 

这个片段在桌面浏览器中效果很好,在我添加之前,我无法在这些桌面浏览器中保留会话cookie。

MobileSafari中是否存在一些令桌面浏览器无法正常工作的问题? 为什么它不以同样的方式工作?


编辑!

这是我的轨道2.3应用程序,我相信相当标准的东西我的CORS头设置

 def add_cors_headers if valid_cors_domain headers['Access-Control-Allow-Origin'] = request.headers['HTTP_ORIGIN'] headers['Access-Control-Expose-Headers'] = 'ETag' headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD' headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match' headers['Access-Control-Allow-Credentials'] = 'true' headers['Access-Control-Max-Age'] = '86400' end end 

今天,Mountain Lion的桌面Safari也开始不发送cookie,就像MobileSafari一样。 我不完全确定,如果我昨天的评估是不准确的,或者苹果只是在拖我。

也可以通过使用https://在远程URL影响?

我不知道这个解决scheme是可行的还是可以接受的,但是我也遇到了与移动Safari和JSONP应用相同的问题。 似乎Safari并不接受第三方cookies。 我去设置> Safari浏览器>接受cookies和设置“始终”,问题蒸发。 祝你好运。

我可以在来自jsonp请求的响应中设置cookie吗?

您没有提到远程服务器是在不同的域还是只是一个不同的子域。 我假设是在不同的领域。

正如@schellsan指出的那样,即使CORS策略允许cookies访问第三方cookie,您也不能将Cookie设置/写入其他域。 这是最新的Safari浏览器限制。 我想Firefox即将做同样的事情。

我目前正在评估的变通办法:

  • 在远程服务器上使用redirect,以便在redirect客户端时(远程URL位于浏览器栏中),您可以设置Cookie
  • 使用自定义标题

我遇到了同样的问题。

我的设置是:

  • 在域a.com的服务器A上的AngularJS(Ionic)应用程序
  • 带有Passport JS的NodeJS作为服务器B上的后端,具有域b.com

除了iOS上的Mobile Safari之外,每个浏览器都使用cookie进行login。 另外,iOS中的移动cookie(不要跟踪)设置的变化对这个问题没有任何影响。

解决scheme是设置一个CNAME DNSlogging

backend.a.com CNAME b.com

打开一个通过iFrame设置cookie的地址 – 这将设置cookie。