【问题标题】:Fetching from CORS-API not allowed for localhostlocalhost 不允许从 CORS-API 获取
【发布时间】:2021-11-27 13:54:42
【问题描述】:

我正在开发一个需要从 Api 获取数据的 React 应用程序。 我让它与假数据一起工作。

fetch('https://jsonplaceholder.typicode.com/posts')
      .then((response) => {
          console.log(response);
          return response.json();
      })
      .then((json) => {
          return json;
      })

现在我想使用 Apigility 从我们的本地 Api 获取数据。

fetch('http://localserver:8081/news')
      .then((response) => {
          console.log(response);
          return response.json();
      })
      .then((json) => {
          return json;
      })

但我得到net::ERR_ABORTED 403 (The origin "http://localho.st:5000" is not authorized)。该应用是使用 create-react-app 创建的,并由其运行脚本提供服务。

现在它可以工作了,当我在 Firefox 和 Edge 中输入 http://localserver:8081/news 时。我收到 json 数据。用我的手机、curl 或 api 测试器尝试时也是如此。

这是尝试从应用中获取时的答案:

HTTP/1.1 403 The origin "http://localhost:3000" is not authorized
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/7.0.30
Access-Control-Allow-Origin: *
Date: Thu, 07 Oct 2021 12:59:08 GMT
Content-Length: 0

当从浏览器调用时:

HTTP/1.1 200 OK
Content-Type: application/hal+json
Vary: Origin
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/7.0.30
WWW-Authenticate: Bearer realm="Service"
Access-Control-Allow-Origin: *
Date: Thu, 07 Oct 2021 13:03:08 GMT
Content-Length: 133933

我已阅读有关设置代理以获取 CORS 调用的信息,但我想知道是否有其他解决方案来解决此问题。

编辑: 本地服务器:

GET /news HTTP/1.1
Host: 10.254.2.10:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: http://localhost:3000
Referer: http://localhost:3000/
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 403 The origin "http://localhost:3000" is not authorized
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/10.0
X-Powered-By: PHP/7.0.30
Access-Control-Allow-Origin: *
Date: Thu, 07 Oct 2021 14:15:22 GMT
Content-Length: 0

https://jsonplaceholder.typicode.com/posts

Host: jsonplaceholder.typicode.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Origin: http://localhost:3000
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
Referer: http://localhost:3000/
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

HTTP/3 200 OK
date: Thu, 07 Oct 2021 14:17:37 GMT
content-type: application/json; charset=utf-8
x-powered-by: Express
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
x-ratelimit-reset: 1633547463
access-control-allow-origin: http://localhost:3000
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
cache-control: max-age=43200
pragma: no-cache
expires: -1
x-content-type-options: nosniff
etag: W/"6b80-Ybsq/K6GwwqrYkAsFxqDXGC7DoM"
via: 1.1 vegur
cf-cache-status: HIT
age: 4307
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=qYfd07Dc%2BG9NUgzVp1DHMPuBcDx8UOvlbWfDD51OGSN8s74yaJFooN99m7nG4NSHV%2BeqY78Qw%2Bb7ozFdWCmF8ngPRnQPc3tlVdrSwGy8TKWYLwWSEYI4YE88GU5yyErQ8P5jLa5tUkPnB4FA6mg7"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 69a7c10bdbf66d8f-MUC
content-encoding: br
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400, h3-28=":443"; ma=86400, h3-27=":443"; ma=86400

【问题讨论】:

  • 浏览器发送cookies,默认情况下不发送。尝试将credentials: "include" 添加到您的fetch options
  • Access to fetch at 'http://localserver:8081/news' from origin 'http://localhost:3000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. 不幸的是,我无法更改 Origin,我认为这里需要它。
  • @Pachari 带有凭据的请求(例如,由fetchcredentials: "include" 发送)如果服务器以Access-Control-Allow-Origin: * 响应将不起作用。还请告诉我们您所说的“从浏览器调用”是什么意思。您的意思是访问相关 URL 作为顶级导航?
  • 您应该编辑您的问题并向我们展示对https://jsonplaceholder.typicode.com/postshttp://localserver:8081/news 的预检请求的回复。
  • @jub0bs,你的意思是请求吗?我不知道如何在 Firefox/Edge 中获取它们。

标签: javascript reactjs cors fetch


【解决方案1】:

Create-React-App 提供了一种简单的方法来处理这个问题:在你的 package.json 文件中添加一个代理字段,如下所示。在这种情况下,从服务器 A 向服务器 B 发出请求

"proxy": "http://localserver:8081/",

【讨论】:

  • 这似乎是 oauth2 问题,而不是 cors 问题。
【解决方案2】:

您可以运行本地反向代理来获取来自同一来源的 API 调用(例如将 localhost:3000/api/news 映射到 localhost:8081/news),但是设置 CORS 代理可能会更容易.

您可以尝试使 API JSONP 并以这种方式规避同源策略,但这也可能比设置 CORS 代理更麻烦。

长话短说:每当您跨来源发出请求时,都需要设置 CORS。

【讨论】:

  • 这就是问题所在:OP 已经设置了 CORS,正如您从标题中的 Access-Control-Allow-Origin: * 中看到的那样。这似乎是一个身份验证问题,而不是 CORS 问题
猜你喜欢
  • 2016-11-18
  • 2021-01-09
  • 2014-04-21
  • 2017-04-09
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2018-11-29
相关资源
最近更新 更多