11

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

在桌面浏览器(经过测试的 Chrome 和 Safari)中,我能够登录,获取会话 cookie,并将该会话 cookie 发送回以供后续请求,以便我可以通过所有 API 调用进行身份验证。

但是,当我通过 Mobile Safari 登录时,cookie 不会后续请求中返回。

我正在使用 Charles Proxy 监视正在发生的事情,它告诉我:

  1. POST https://myremoteserver.com/sessions.json传递我的登录信息
  2. 它成功并收到带有有效Set-Cookie标头的响应。
  3. GET https://myremoteserver.com/checkout.json被请求,没有Cookie请求头。
  4. 服务器响应好像我没有登录一样。

我使用这个片段Zepto.js来确保withCredentials: true在 XHR 对象上正确设置。(请原谅咖啡脚本)

# 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 中是否有一些怪癖会阻止它像桌面浏览器一样工作?为什么它不能以同样的方式工作?


编辑!

这是我在 Rails 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 一样。我不完全确定我昨天的评估是否不准确,或者 Apple 只是在欺骗我……

https://在远程 url 上使用也会受到影响吗?

4

5 回答 5

2

我不知道这个解决方案是否可行或您是否可以接受,但我在移动 Safari 和 JSONP 应用程序中遇到了同样的问题。似乎 Safari 并未设置为接受第三方 cookie。我去了设置> Safari>接受Cookie并设置“始终”,问题就消失了。祝你好运。

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

于 2013-07-31T23:53:21.880 回答
2

我相信您正在体验我在我的应用程序中看到的内容。我的问题是因为 iOS Safari 带有一个默认"Prevent Cross-Site Tracking"启用的默认选项,导致浏览器阻止所有第三方 cookie,即使是由后端服务器从不同域发出的 cookie,并且 CORS 配置正确。

我发现这个问题的唯一解决方案是在生产中使用代理,就像我在开发中所做的那样。我在 Azure 中使用 Azure Functions 完成了这项工作,并使所有请求都通过代理。那时 iOS Safari 并没有阻止我的 cookie,一切都按预期设置。

我在我的博客https://medium.com/@omikolaj1/complete-guide-to-deploying-angular-and-asp-net-33a0976d0ec1中写过它

于 2019-08-04T03:31:22.280 回答
0

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

正如@schellsan 指出的那样,即使 CORS 政策允许,您也不能将 cookie 设置/写入到不同的域,因为 Safari 的第 3 方 cookie 限制。这是最新的野生动物园限制。我猜 Firefox 也将这样做。

我目前正在评估的解决方法:

  • 在远程服务器上使用重定向,这样当客户端被重定向时(远程 URL 在浏览器栏中),您可以设置 cookie
  • 使用自定义标题
于 2014-03-19T14:18:25.610 回答
0

我遇到了同样的问题。

我的设置是:

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

除了 iOS 上的 Mobile Safari,使用 cookie 的登录在所有浏览器上都很顺利。此外,iOS 中移动 cookie(不跟踪)设置的更改对问题没有任何影响。

解决方案是设置 CNAME DNS 记录

backend.a.com CNAME b.com

于 2016-03-31T12:04:15.353 回答
-1

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

于 2014-11-04T05:49:16.040 回答