如何排查 API Gateway API 中的 CORS 错误?

2 分钟阅读
0

当我尝试调用我的 Amazon API Gateway API 时,我收到错误消息“No 'Access-Control-Allow-Origin' header is present on the requested resource”(请求的资源上没有“Access-Control-Allow-Origin”标头)。如何排查 API Gateway 中的此错误和其他 CORS 错误?

简短描述

如果服务器不返回 CORS 标准所要求的 HTTP 标头,就会出现跨源资源共享 (CORS ) 错误。要解决来自 API Gateway REST APIHTTP API 的 CORS 错误,必须重新配置 API 以满足 CORS 标准。

有关为 REST API 配置 CORS 的更多信息,请参阅为 REST API 资源启用 CORS。对于 HTTP API,请参阅为 HTTP API 配置 CORS

**注意:**CORS 必须在资源级别配置,并且可以使用 API Gateway 配置或后端集成(例如 AWS Lambda)进行处理。

解决方法

以下示例流程说明如何排查 No ‘Access-Control-Allow-Origin’ header present CORS 错误。但是,您可以使用类似的流程排查所有 CORS 错误。例如:Method not supported under Access-Control-Allow-Methods header 错误和 No ‘Access-Control-Allow-Headers’ headers present 错误。

**注意:**以下任意原因都可能会导致 No 'Access-Control-Allow-Origin' header present 错误:

  • API 未配置可返回所需 CORS 标头的 OPTIONS 方法。
  • 另一种方法类型(如 GETPUTPOST)未配置为返回所需的 CORS 标头。
  • 具有代理集成非代理集成的 API 未配置为返回所需的 CORS 标头。
  • (仅对于私有 REST API),调用的调用 URL 不正确,或者流量没有路由到接口 Virtual Private Cloud (VPC) 终端节点。

确认引起错误的原因

有两种方法可以确认 API Gateway 中的 CORS 错误的原因:

  • 在调用 API 时,创建 HTTP 存档(HAR)文件。然后,通过检查 API 响应中返回的参数中的标头来确认文件中错误的原因。
    -或者-
  • 使用浏览器中的开发人员工具检查失败 API 请求的请求和响应参数。

对遇到错误的 API 资源配置 CORS

对于 REST API

按照使用 API Gateway 控制台在资源上启用 CORS 中的说明进行操作。

对于 HTTP API

请按照为 HTTP API 配置 CORS 中的说明进行操作。

**重要提示:**如果您为 HTTP API 配置了 CORS,则 API Gateway 会自动向预检 OPTIONS 请求发送响应。即使没有为你的 API 配置 OPTIONS 路由,也会发送此响应。对于 CORS 请求,API Gateway 会将配置的 CORS 标头添加到集成的响应中。

在您的 API 资源上配置 CORS 时,请确保执行以下操作:

  • 对于 Gateway Responses for <api-name> API (<api-name> API 的网关响应),选择 DEFAULT 4XXDEFAULT 5XX 复选框。

**注意:**选择这些默认选项后,API Gateway 会使用所需的 CORS 标头进行响应,即使请求未到达终端节点也是如此。例如,如果请求包含不正确的资源路径,API Gateway 仍会作出响应,显示 403“Missing Authentication Token”(缺少身份验证令牌)错误

  • 对于 Methods (方法),如果尚未选中 OPTIONS 方法,请选中该方法的复选框。此外,选中 CORS 请求可用的所有其他方法的复选框。例如:GETPUTPOST

**注意:**如果在 API Gateway 控制台中配置 CORS,则会向资源添加 OPTIONS 方法(如果尚不存在)。它还使用所需的 Access-Control-Allow-* 标头配置 OPTIONS 方法的 200 响应。如果您已经使用控制台配置了 CORS,则再次配置它将覆盖所有现有值。

配置 REST API 集成以返回所需的 CORS 标头

将后端 AWS Lambda 函数HTTP 服务器配置为在响应中发送所需的 CORS 标头。请记住以下内容:

  • 允许的域必须作为列表包含在 Access-Control-Allow-Origin 标头值中。
  • 对于代理集成,您无法在 API Gateway 中设置集成响应来修改 API 后端返回的响应参数。在代理集成中,API Gateway 会将后端响应直接转发给客户端。
  • 如果您使用非代理集成,则必须在 API Gateway 中手动设置集成响应以返回所需的 CORS 标头。

**注意:**对于具有非代理集成的 API,使用 API Gateway 控制台对资源配置 CORS 会自动将所需的 CORS 标头添加到资源中。

(仅适用于私有 REST API)检查接口终端节点的私有 DNS 设置

对于私有 REST API,确定是否为关联的接口 VPC 端点激活了私有 DNS

如果激活了私有 DNS

请务必使用私有 DNS 名称从 Amazon Virtual Private Cloud(Amazon VPC)中调用私有 API

如果私有 DNS 未激活

您必须手动将流量从调用 URL 路由到 VPC 终端节点的 IP 地址。

**注意:**无论是否激活私有 DNS,都必须使用以下调用 URL:

https://api-id.execute-api.region.amazonaws.com/stage-name

确保将 api-idregionstage-name 的值替换为 API 所需的值。有关更多信息,请参阅如何调用私有 API

**重要提示:**如果在未激活私有 DNS 的情况下配置了 CORS,请记住以下限制条件:

  • 您不得使用特定于端点的公有 DNS 名称从 Amazon VPC 中访问您的私有 API。
  • 您不能使用主机标头选项,因为来自浏览器的请求不允许主机标头操作。
  • 您不能使用 x-apigw-api-id 自定义标头,因为它会启动不包含标头的启动前OPTIONS 请求。使用 x-apigw-api-id 标头的 API 调用将无法到达您的 API。

相关信息

测试 CORS

使用 API Gateway 导入 API 在资源上启用 CORS

相关视频

AWS 官方
AWS 官方已更新 1 年前