公共 api 请求没有“Access-Control-Allow-Origin”
Posted
技术标签:
【中文标题】公共 api 请求没有“Access-Control-Allow-Origin”【英文标题】:No 'Access-Control-Allow-Origin' for public api request 【发布时间】:2018-03-28 00:51:43 【问题描述】:我正在尝试使用 javascript(在客户端)从我的网站向第三方 api 执行 ajax 请求,但我收到 No 'Access-Control-Allow-Origin' 错误。当尝试从 node.js 项目访问它时,一切正常。 此外,当使用 --disable-web-security 打开 Chrome 时,一切正常。 任何有关此问题的信息将不胜感激:-)
【问题讨论】:
developer.mozilla.org/en-US/docs/Web/HTTP/CORS “公开”与此无关。 【参考方案1】:如果不使用 CORS,您将无法访问第三方 API。 CORS 将特殊标头(例如 Access-Control-Allow-Origin
)添加到 HTTP 响应中。这确保了 API 可以控制哪个前端可以向它发出请求。然而,这意味着您的 API 需要识别您的前端 URL 并接受来自它的请求。
您可以 (a) 在 API 端使用 CORS(需要对 API 进行更改)或 (b) 使用您的服务器端语言发出 API 请求(例如 php 向 API 发出请求,而前端end 接收来自 PHP 后端的响应)。浏览器的安全设置禁止其他所有操作。
您可以阅读有关 CORS 的更多信息,例如here.
【讨论】:
我很难理解一些事情。 1. 如果第三方API禁用了CORS,服务器端和客户端的请求会被拒绝吗? 2. 如果第三方API启用了CORS,为什么客户端的请求会被浏览器拒绝,而服务器端的请求(例如PHP)不会被拒绝?我很难理解的是为什么来自客户端(浏览器)的请求会被拒绝 问题是浏览器的安全设置。浏览器不允许非同源 ajax 请求。如果另一个域启用了特殊的 CORS 设置(即明确允许您的域),则只能对另一个域进行 Ajax 调用。这样做是因为您可以轻松地从evil.com
向backend.com
发出ajax 请求并附加身份验证cookie。因此浏览器不允许你这样做。如果您使用 PHP 或 cURL 发出请求,则不会有与浏览器相同域的任何限制。
首先,感谢您的帮助。只是想确保我明白了: 1. 假设我在“mydomain.com/api”上有一台服务器。由于它是一个开放的 api,我想让客户端能够访问它,所以我为所有 (*) 启用了 CORS。即使启用了 CORS,来自域的 javascript 命令:“otherdomain.com”也不会被批准? 2.请求发送到服务器前是浏览器拒绝了,还是服务器拒绝了?
如果您定义 CORS 设置以允许 API 上的每个来源 (*
),那么它将在浏览器中工作。但是,如果您对此公共 API 进行了身份验证,则需要确保不使用 cookie(或至少在标头中使用 CSRF 令牌)。如果您尝试从浏览器执行跨域 Ajax 请求,浏览器实际上将首先进行 OPTIONS
调用并询问服务器是否允许前端进行实际调用。浏览器评估 OPTIONS 调用的响应,然后根据 CORS 设置发出实际请求。
OPTIONS
请求以及实际的例如POST
请求在网络选项卡中可见,例如谷歌浏览器开发工具。 CORS 实际上只是带有 OPTIONS
的预检,在预检和实际请求中都有特殊的标头(以 Access-Control-
开头)。以上是关于公共 api 请求没有“Access-Control-Allow-Origin”的主要内容,如果未能解决你的问题,请参考以下文章
api design - 如何设计公共 POST api 以防止垃圾邮件请求
无法找到调用 https 公共 api 的请求目标的有效认证路径
向公共 API 发出请求时出现“无 'Access-Control-Allow-Origin' 标头”错误