有没有办法绕过访问控制允许来源?
Posted
技术标签:
【中文标题】有没有办法绕过访问控制允许来源?【英文标题】:Is there a way around Access-Control-Allow-Origin? 【发布时间】:2015-07-21 09:52:04 【问题描述】:我正在使用 JIRA 的 API 来获取有关错误的一些信息。这是我用来获取它的 JQuery 示例:
var endpoint = 'https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631';
$.get(endpoint, function(data)
do_stuff(data, data['fields']['project']['self']);
);
而且,我遇到了可怕的Access-Control-Allow-Origin
错误。它看起来像这样:
XMLHttpRequest cannot load
https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://127.0.0.1:8000' is therefore not allowed access.
如果可能的话,我真的很想使用这个 API。遵循question 上的指示并没有帮助。我又遇到了一个错误,
GET https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631callback=jQuery172039181585889309645_1431307158851?_=1431307165515
似乎是一个 Jquery 错误,所以我认为这不是正确的方法。也许服务器不允许jsonp
。
无论如何,有没有人有办法解决这个问题,或者我可以不使用这个特定的 API?谢谢
【问题讨论】:
你应该问 JIRA。 【参考方案1】:没有外部代码,无法完全从浏览器启用跨源请求。如果有,那将完全违背安全保护的初衷。
使用浏览器时,由服务器决定是否要支持跨源请求以及要支持来自哪些域的请求。您无法在客户端绕过它。
选择是:
-
服务器允许从您的域或所有域访问 COR。
服务器支持 JSONP,让您可以使用它来解决跨源访问问题。
您创建自己的服务器代理,从浏览器向您自己的服务器发出请求(可能是同源或启用 CORS),然后您自己的服务器从其他站点获取数据并将其返回给浏览器。服务器不受相同来源限制的限制,因为这是仅内置于浏览器中的安全功能。
您会找到一些第三方代理服务,您可以使用它们来实现与选项 #3 相同的目的。
仅供参考,Google 搜索出现了这篇关于在 API 上启用 CORS 的文章:https://answers.atlassian.com/questions/69356/cross-origin-resource-sharing-with-jira-rest-api-and-javascript。我对该服务的了解还不够,无法完全按照文章进行操作,但它可能会为您指明一个有用的方向。
【讨论】:
这是一个很好的答案,所以我会保留它作为接受的答案。不过,我应该提一下,我意识到这是浏览器的事情。我找到了一个名为 CORS 的 Google-chrome 插件,它允许你提出这个请求并且它完全可以工作。不知道这对推送到实时网站有什么影响,但至少我现在可以在 localhost 上破解了 :)【参考方案2】:你好,简短的回答是“是”。
中等答案是“在您的应用程序服务器上启用 CORS”
长答案在这里:http://enable-cors.org/
在某些时候您会遇到“飞行前请求”的概念,您可能会感到困惑。
那是因为它令人困惑、愚蠢且设计不佳。继续前进。
启用 CORS 的最简单方法是在您的网络服务器(nginx 或 apache)上,不过,您可以在应用程序本身中启用它。
http://enable-cors.org/ 站点列出了各种 Web 服务器和应用程序堆栈的配置。
祝你好运!
【讨论】:
对不起,我应该在我的问题中说明这一点!如果我想在客户端上做这一切,还有可能吗?仅 JS? 嘿,亚历克斯,别担心。是的,这是可能的。 @jfriend00 的回答很好地说明了方法。以上是关于有没有办法绕过访问控制允许来源?的主要内容,如果未能解决你的问题,请参考以下文章