GET 请求预检在浏览器中失败(使用 React 框架)

Posted

技术标签:

【中文标题】GET 请求预检在浏览器中失败(使用 React 框架)【英文标题】:GET request preflight fails in browser (using React framework) 【发布时间】:2020-05-20 08:06:23 【问题描述】:

我正在尝试使用 Authorizer 标头发送 API GET 请求。该请求适用于 curl 和 Postman:Postman response

如果我发送没有 Authorizer 标头的 GET 请求,它会按预期工作,但只要我添加标头,它就会发送预检 OPTIONS 并且它会失败。

这是我的代码:

function GetData() 
    var req = new XMLHttpRequest();
    req.addEventListener("load", () => 
      console.log(req.responseText);
    );
    req.open(
      "GET",
      "https://qrdc992lul.execute-api.eu-west-1.amazonaws.com/dev/account"
    );
    req.setRequestHeader("Authorization", "Bearer " + token);
    req.withCredentials = true;
    req.send();
  

我收到以下回复:

加载资源失败:服务器响应状态为403()

访问 XMLHttpRequest 在 'https://qrdc992lul.execute-api.eu-west-1.amazonaws.com/dev/account' 来自原点 'https://ogx7o.csb.app' 已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

响应头:

内容长度:42 内容类型:应用程序/json 日期:2 月 4 日星期二 2020 年 13:09:37 GMT 状态:403 通过:1.1 37adc88abfddc6deef6672a655706cd4.cloudfront.net (CloudFront) x-amz-apigw-id: HX36rHhxDoEFXxw= x-amz-cf-id: hgFvoQwvQ96Uge3ciwwvd41RCNyX1oZyVydPIyXqPQxe0aAeklM2WA== x-amz-cf-pop: MAN50-C3 x-amzn-errortype: MissingAuthenticationTokenException x-amzn-requestid: 4383a667-e30b-44fb-ac3b-bd532e99f1d4 x-cache: 错误 来自云端

我阅读了有关 CORS 标头和预检的信息,我有点想问题是响应标头中没有 Access-Control-Allow-Origin 但不知道如何解决该问题。

我已将代码 sn-p 添加到 Codesandbox: https://codesandbox.io/s/fragrant-river-ogx7o

API 是 API Gateway Lambda 代理集成。

我还在学习 React,我感觉我发送的请求是错误的。我错过了什么?

更新: API Gateway is set to return the headers

【问题讨论】:

这能回答你的问题吗? XMLHttpRequest cannot load XXX No 'Access-Control-Allow-Origin' header 尝试删除req.withCredentials = true; 【参考方案1】:

我找到了答案。 万一以后有人发现这个问题,我解决了以下方法:

作为预检发送 OPTIONS 请求,这也需要一个 API 端点。因此,您需要 GET 和 OPTIONS,并为两者设置方法响应标头。

/帐户 获取 选项

API 网关 -> 资源 -> 操作 -> 启用 CORS 指导您完成操作

代码不正确。正如 Anurag Hazra 所建议的那样, req.withCreditentials = true;已删除

【讨论】:

【参考方案2】:

在您的后端,您需要授权您添加的标头 使用Access-Control-Allow-Headers (这是您添加的标题“授权”)

【讨论】:

以上是关于GET 请求预检在浏览器中失败(使用 React 框架)的主要内容,如果未能解决你的问题,请参考以下文章

IE 11 上 CORS 预检请求的奇怪问题失败

Axios CORS/Preflight 因 Laravel 5.4 API 调用而失败

Azure APIM 在预检和从 axios 发出的 GET 请求时返回空响应正文,状态代码为 200

邮递员模拟服务不接受预检请求

React:如何强制浏览器为 OPTION 发送特定的标头(预检)

Chrome 不缓存预检