我在进行CORS请求时遇到了奇怪的错误(React应用程序通过https与API通信)。这些错误仅出现在IOS 10.3.1和Chrome浏览器(57)上(Safari和WebViews没有问题)。由于缺乏调试IOS Chrome的工具,我唯一记录到的是Sentry日志(第三方服务)。这些错误的变体如下:
SecurityError Blocked a frame with origin "https://xxxxxreactapp.com" from accessing a frame with origin "https://xxxxx.fls.doubleclick.net". Protocols, domains, and ports must match.
特定请求是从Google Tag Manager发出的,但对我的API的请求也以类似方式失败(尽管显然没有提到frames,但仍然与跨源相关)。
向我的API发起典型的请求握手如下:
这段描述了我控制的 App 和 API 之间的交互,我倾向于认为我的设置有问题,但两件事情导致不同的结论:
SecurityError Blocked a frame with origin "https://xxxxxreactapp.com" from accessing a frame with origin "https://xxxxx.fls.doubleclick.net". Protocols, domains, and ports must match.
特定请求是从Google Tag Manager发出的,但对我的API的请求也以类似方式失败(尽管显然没有提到frames,但仍然与跨源相关)。
向我的API发起典型的请求握手如下:
OPTIONS /jp/plusbus HTTP/1.1
Host: api-xxxxxx.xxx.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: https://xxxxxreactapp.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Access-Control-Request-Headers: content-type,x-access-token,x-trace-token
Accept: */*
Referer: https://xxxxxreactapp.com/xxxx/xxx
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,el;q=0.6
以及服务器对此的响应:
HTTP/1.0 204 No Content
Connection: close
Content-Type: text/html
Access-Control-Max-Age: 1728000
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,PATCH
Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Access-Token,X-Customer-Token,X-Customer-Device,X-Brand-Id,X-User-Token,X-User-Grant-Token,X-Trace-Token,X-Smartcard-Version,Authorization
Content-Length: 0
这段描述了我控制的 App 和 API 之间的交互,我倾向于认为我的设置有问题,但两件事情导致不同的结论:
- 我在同一网站上也使用 Google Tag 管理器,其请求也以同样的方式失败(GTM 使用标准 iframe 设置,也尝试跨域通信)。
- 这个设置一直很稳定,直到最后一个 IOS 更新,它在 IOS 10.2 中正常工作。
设法解决了 api 调用的问题,与我的代理中间件堆栈有关。 但是第三方问题仍未解决。
所有依赖 iframe 向外部源通信数据的工具都会因为上述 SecurityError Blocked a frame ....
而失败,包括 GoogleTagManager 和 Paypal 支付。