1

我正在使用 Javascript 编写一个 Web 应用程序,它需要访问第三方 API(位于x.apisite.comy.apisite.com)。我正在使用XMLHTTPRequest,但是从我自己的本地服务器提供文件时,由于同源策略而失败。

现在,这个网络应用程序应该安装在我的移动设备上,任何下载的文件都将被缓存。因此,我将我的 DNS 条目更改为指向x.apisite.comy.apisite.com自己的本地服务器。然后我下载文件,然后将 DNS 条目改回正确的条目。我想既然浏览器认为脚本是从那里下载的*.apisite.com,我现在可以做XMLHTTPRequests to 了*.apisite.com。但是,情况似乎并非如此,我仍然遇到同源策略错误。

我究竟做错了什么?

这是我正在做的事情的基本想法:

<!DOCTYPE html>
<html>
    <head>
        <!-- this will actually be downloaded from my own local server -->
        <script src="http://x.apisite.com/script-0.js">
        <script src="http://y.apisite.com/script-1.js">
...

script-0.js,我做一个XMLHTTPRequestx.apisite.com,同样在script-1.js,我访问y.apisite.com

4

1 回答 1

1

实际答案(不推荐):从您控制的域创建第三方域的 CNAME 记录,然后使用这些域并希望第三方的主机不查看 HTTP Host 标头。请注意,如果客户端尝试对第三方主机进行身份验证,这将不起作用;例如使用 HTTPS 时(某些客户端浏览器可能会在某些情况下强制使用 HTTPS)。

理想答案:要求第三方使用 CORS 授权来自您的源域的代码发出的请求(某些主机已经允许来自任何源的代码的请求,您应该检查一下)。

替代方案:如果第三方不想让客户端使用您域中的代码发出跨域请求,那么您必须自己(从您的服务器)发出这些请求。然后,您发送到客户端浏览器的代码将仅与同一来源进行交互,但这也意味着如果您为他们代理请求(如果相关),用户将必须使用他们的凭据信任您,或者您必须拥有凭据您自己的身份验证您的服务器到第三方主机,这允许您在那里做任何您想做的事情。这也意味着您也承担了流量负载,这可能会或可能不会很重,具体取决于应用程序。可能还有许多其他含义,这些含义都源于您明确对这些请求负责这一事实。

注意:虽然这听起来有点复杂,但了解用户、用户的客户端浏览器、在浏览器中执行的代码、该代码的来源以及该代码发出请求的域之间的信任机制可能会很有用. 始终牢记每一方的最大利益,并且很容易为您的特定问题找到解决方案。

最终答案(每个人都讨厌它,但你可能已经预料到了):“这取决于你到底想做什么。” (对不起。)

于 2013-07-29T12:49:16.353 回答