Node.js HTTP请求从邮递员和节点开始工作,但不响应

Node.js HTTP请求从邮递员和节点开始工作,但不响应,node.js,reactjs,authorization,google-cloud-run,Node.js,Reactjs,Authorization,Google Cloud Run,在堆栈溢出问题上有一些类似的问题,并且建议的解决方案都不起作用,所以我将详细介绍这个案例以及我所尝试的 我有一个托管在Cloud Run上的服务器应用程序,只有在请求授权头中使用适当的承载令牌才能访问该应用程序。我尝试过通过Postman和来自本地Nodejs服务器的Axios请求访问它,并使用了授权头,效果很好。使用React(专门创建React应用程序),我得到以下错误:访问位于的XMLHttpRequest'https://myserver-lhp5a9xp5a-ue.a.run.app/

在堆栈溢出问题上有一些类似的问题,并且建议的解决方案都不起作用,所以我将详细介绍这个案例以及我所尝试的

我有一个托管在Cloud Run上的服务器应用程序,只有在请求授权头中使用适当的承载令牌才能访问该应用程序。我尝试过通过Postman和来自本地Nodejs服务器的Axios请求访问它,并使用了授权头,效果很好。使用React(专门创建React应用程序),我得到以下错误:
访问位于的XMLHttpRequest'https://myserver-lhp5a9xp5a-ue.a.run.app/api/rules“起源”http://localhost:3000'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。

在服务器端,我得到了当传递了错误的授权令牌时Cloud Run给出的403错误。另外,当我允许从云运行端进行未经验证的访问时(因此不需要授权头),请求工作正常,因此看起来这确实是授权头的问题,而不是CORS的问题

此外,我在服务器端处理COR。以下是我的服务器端代码:

var express = require('express');
var router = express.Router();
const cors = require('cors');

router.options('/api/rules', cors());
router.get('/api/rules', cors(), (req, res, next) => {
  res.status(200).send()
});
这是我的代码:

const axiosInstance = axios.create({
  baseURL: process.env.REACT_APP_API_BASE_URL
});

const buttonClickHandler = async (event) => {
  const resp = await axiosInstance.get('/api/rules'
   , {
     headers: {
       'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZ...' // I used this token within the same minute when trying the request via Postman or from my Nodejs app, so a token expiry isn't the issue.
     }
   }
  )
  console.log(resp.data)
}
以下是我到目前为止所做的尝试:

  • 使用fetch而不是axios-相同错误
  • 使用相同的令牌,在相同的5秒钟内,从邮递员或Nodejs服务器发送请求——效果很好
  • 使用axios拦截器设置授权-相同错误
  • 删除授权周围的单引号-相同错误
  • 将请求发送到我的Nodejs服务器,并对标头执行console.log以确保正确传递授权令牌(它是)
  • 不使用axios实例,但在请求中拼写完整URL-相同错误
  • 在我的云运行服务器上尝试其他端点-相同错误
  • 部署我的React应用程序从https端点提供服务,并从那里发送请求-相同的错误
  • Accept:'*/*'
    添加到标题
  • 'Accept':'*/*'
    添加到标题
  • 'Content-Type':'application/json'
    添加到标题中
  • 以上三点的所有组合
    • TLDR

      • CORS是一种内置于web浏览器中的机制。这不是UI代码问题
      • 要修复CORS问题,您需要在API(服务器)端进行更改

      以下是幕后工作:

      浏览器:在向API端点发送任何新请求之前,发送
      选项
      调用以检查服务器类型并获取标头。它检查
      访问控制是否允许原点
      。考虑到这一点,
      Access Control Allow Origin
      header只指定允许哪些跨原点,尽管默认情况下浏览器只允许相同的原点

      邮递员:通过使用
      选项
      调用服务器,直接发送
      获取
      发布
      删除
      等请求,而不检查服务器类型并获取标题
      访问控制允许来源


      您必须在服务器中配置
      访问控制允许源站
      标题以解决CORS问题。

      我在挖掘之后找到了答案,感谢@aniket kolekar为我指明了正确的方向

      当邮递员或Nodejs服务器查询端点时,如
      GET
      POST
      PUT
      DELETE
      ,他们发送呼叫时不首先检查
      选项。创建一个应用程序

      我查询的服务托管在Cloud Run上,不允许未经验证的调用。因此,虽然我在通话中加入了授权标题以进行
      GET
      通话,但它并未包含在飞行前
      选项中。其实,


      云运行PM回答说,这是云运行的已知问题。我现在要解决的问题是在Cloud Run上托管两个服务—一个不需要身份验证,并且有效地充当代理服务器,将呼叫从客户端服务路由到屏蔽服务器服务。

      谢谢!但不幸的是,我不认为这是答案:1)我在服务器端已经有了选项和cors()处理(好的一点-我会在问题中添加代码)2)当我允许在服务器端进行未经验证的调用时(原则上,这与cors无关),请求工作正常。您是如何使用身份验证中间件的?是否有类似于
      router.get('/api/rules',**auth**,cors(),(req,res,next)=>{
      ?很高兴我能帮上忙