概括:
我正在 React 中向我的 Node.js 服务器发出获取请求。
每当我不包括 credentials: "include"
并且在我的获取请求中时,请求就会成功地发送到服务器并返回给客户端。
但是,当我包含 credentials: "include"
时,如下所示:
fetch('http://localhost:8000/',
{ method: "GET",
'credentials': 'include',
headers: new Headers({
'Accept': 'application/json',
'Access-Control-Allow-Origin':'http://localhost:3000/',
'Content-Type': 'application/json',
})
}) ....
我收到此预检错误:
login:1 Access to fetch at 'http://localhost:8000/' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: 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'.
语境:
为什么我需要包括其中任何一个?
- 我认为很明显为什么我需要包含“标头”,我使用的是 cors,如果我不包含
'Access-Control-Allow-Origin':'http://localhost:3000/'
那么服务器将不会接受请求。 - 如果没有它就可以工作,为什么我需要包括“凭据”?因为如果我在获取请求正确执行时不包含“凭据”,除非我包含
credentials: "include"
否则会话 cookie 将不会从我的客户端发送到服务器。如果我删除所有标头并包含mode: 'no-cors'
,然后执行提取请求并将会话 cookie 发送到服务器,但显然我得到了一个不透明的响应,并且无论如何我都需要使用 cors。
尝试:
有很多与此类 似的 堆栈溢出问题,但并不准确,因此他们的解决方案不起作用。
以下是我尝试过但没有用的一些方法:
这已经在我的服务器上,但有人建议在客户端尝试它,所以我做了:
'Access-Control-Request-Method': 'GET, POST, DELETE, PUT, OPTIONS',
'Access-Control-Allow-Credentials': 'true',
'withCredentials': 'true',
Origin: 'http://localhost:3000/auth',
crossorigin: true,
是的,我已经设置了一个代理(这有助于解决之前的问题):
"proxy": "http://localhost:8000"
我已经尝试了更多其他解决方案但无济于事,我确定我已经阅读了与此问题相关的绝大多数问题以及相应的答案,即使不是全部。我的服务器设置正确,这就是为什么我没有包含任何代码的原因。
在理想情况下,我不需要使用 credentials: "include"
将会话 cookie 发送回我的服务器,但这是我必须实施的另一个解决方案的原因。
如果有人能帮助我,我将不胜感激。
TLDR:
只要我不包含 credentials: "include"
,我的预检请求就会通过,但会话 cookie 不会通过。
当我包含 credentials: "include"
和 mode: 'no-cors'
时,会话 cookie 被传递,但是,我收到一个不透明的响应,我需要使用 cors。
最后,当我将两者(cors 和凭据)结合起来时,我的预检请求失败并出现以下错误:
login:1 Access to fetch at 'http://localhost:8000/' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: 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'.
原文由 ezg 发布,翻译遵循 CC BY-SA 4.0 许可协议
这很可能来自您的服务器。您是否在后端安装了 cors npm 包?
https://www.npmjs.com/package/cors
您还需要配置它。
最有可能在您的 index.js 文件中。
这必须在任何路由之前设置。 Origin 可以是一组白名单(允许)域,用于与您的后端 api 通信。