可以使用中间层作为 API 绕过 CORS 吗?
Posted
技术标签:
【中文标题】可以使用中间层作为 API 绕过 CORS 吗?【英文标题】:Can using a middle layer as an API bypass CORS? 【发布时间】:2019-03-06 08:01:51 【问题描述】:我正在使用 ReactJS 开发一个应用程序,该应用程序使用 Hyperion 提供的 rest API 与另一个企业应用程序(Oracle Hyperion)进行通信。问题是这个API没有官方支持,也不支持CORS。我尝试找到解决此问题的方法,但没有成功。
在尝试解决另一个问题时,我创建了一个 Python Flask 应用程序,并使 ReactJS 应用程序和 Hyperion Rest API 之间的所有通信都通过它。不知何故,这使得正在发生的 CORS 错误消失了。我在 Flask 应用中使用了以下导入和函数
from flask_cors import CORS, cross_origin
CORS(app)
ReactJS 应用程序现在只使用 Axios 与 Flask 应用程序通信,并且所有请求都成功,无需允许 CORS 插件。
问题是:我现在需要知道这怎么可能,因为出于不同的原因我有一个命令要避免使用 Python。我想知道问题是如何解决的,以确保当我使用另一种语言重写此部分或什至消除它时它不会再次出现。在中间使用 API 是解决 CORS 问题还是什么?
【问题讨论】:
【参考方案1】:服务器发送的 Cors 标头由客户端验证,因此执行 cors 的是客户端。有浏览器插件可以禁用 cors,但出于安全原因,不建议这样做。 处理此问题的常用方法是使用反向代理并将相关的 HTTP 访问控制响应标头添加到响应中。 因此,您可以通过使用反向代理(例如 nginx/apache)来避免使用 python。 该 api 与它无关,实际上在您的情况下,您使用烧瓶作为添加 cors 标头的反向代理。您可以使用浏览器开发工具进行调试。
【讨论】:
说用Flask做反向代理,是不是这个意思? response.getHeaders().add("Access-Control-Allow-Origin", "*"); (Java 代码)并且说客户端正在执行,您是指浏览器吗? 我不建议将flask用作反向代理,如果它仅用于cors,最好使用专门设计的应用程序(apache / nginx),但在这种情况下,您似乎正在使用flask作为反向代理。客户端我的意思是浏览器是的。此外,使用“*”会使您面临潜在的安全问题,您应该使用引用 url 主机。 您有关于如何使用 apache 作为反向代理将标头添加到响应中的任何指南或资源吗?非常感谢您的帮助。 这有点超出了这个问题的范围,但你可以试试这个站点的 cors 配置:enable-cors.org/server.html,例如。 enable-cors.org/server_nginx.html 。此处描述了反向代理配置:docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy。首先检查是否可以直接访问 api,然后添加相应的 Access-Control-Allow-Origin 标头。 您确定在我的情况下使用 apache 作为反向代理有效吗?我从您添加的链接中了解到,它将标头添加到来自 apache 的传出响应,而不是像我需要的传入响应。【参考方案2】:我的 CORS 切片代码
导入请求
proxyUrl = 'https://cors-anywhere.herokuapp.com/'
url = 'Endpoint URL you want yo post to'
datas= 'data1': 'daVal1', 'data2': 'daVal2'
headers = 'x-requested-with':'root_URL_Of_Endpoint', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
x = requests.post(url, data = myobj, headers=headers)
print(x.text)
尽情享受吧!
【讨论】:
以上是关于可以使用中间层作为 API 绕过 CORS 吗?的主要内容,如果未能解决你的问题,请参考以下文章