Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

为 API Gateway 资源启用 CORS

如果 API 的资源收到来自域 (非 API 自有域) 的请求,您必须在资源上为选定方法启用跨源资源共享 (CORS)。这相当于让您的 API 至少使用 CORS 需要的以下响应标头对 OPTIONS 预检请求做出响应:

  • Access-Control-Allow-Methods

  • Access-Control-Allow-Headers

  • Access-Control-Allow-Origin

在 API Gateway 中,您会使用模拟集成类型来设置 OPTIONS 方法,以启用 CORS,从而将之前的响应标头 (使用下文讨论的静态值) 作为方法响应标头返回。此外,实际启用了 CORS 的方法还必须至少在其 200 响应中返回 Access-Control-Allow-Origin:'request-originating server addresses' 标头。您可以将特定 request-originating server addresses 的静态值替换为 *,以指示任何服务器。但是,在启用如此广泛的支持时,您应该谨慎一些,仅在充分了解后果后这样做。

借助 Lambda、AWS 或 HTTP 集成,您可以利用 API Gateway 并使用方法响应和集成响应设置所需的标头。对于 Lambda 或 HTTP 代理集成,您仍然可以在 API Gateway 中设置所需的 OPTIONS 响应标头。但是,您必须依靠后端返回 Access-Control-Allow-Origin 标头,因为代理集成已禁用集成响应。

提示

您必须设置 OPTIONS 方法,通过处理预检请求来支持 CORS。但是,如果 1) API 资源仅公开了 GET、HEAD 或 POST 方法,2) 请求负载内容类型是 application/x-www-form-urlencodedmultipart/form-datatext/plain,以及 3) 请求不包含任何自定义标头,那么 OPTIONS 方法可选。如果可能,我们建议您使用 OPTIONS 方法在 API 中启用 CORS。

本节介绍如何在 API Gateway 中使用 API Gateway 控制台或 API Gateway 将 API 导入 API Gateway 为方法启用 CORS。

先决条件

使用 API Gateway 控制台在资源上启用 CORS

  1. 通过 https://console.amazonaws.cn/apigateway 登录 API Gateway 控制台。

  2. 在 API Gateway 控制台中,选择 APIs 下的一个 API。

  3. 选择 Resources 下的一个资源。这将为资源上的所有方法启用 CORS。

    或者,您也可以在资源下选择一个方法,仅为此方法启用 CORS。

  4. Actions 下拉菜单中选择 Enable CORS

    选择“Enable CORS”
  5. Enable CORS 表单中,执行以下操作:

    1. Access-Control-Allow-Headers 输入字段中,键入客户端必须在实际资源请求中提交的逗号分隔标头列表的静态字符串。使用控制台提供的 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' 标头列表,或指定您自己的标头。

    2. 将控制台提供的 '*' 的值用作 Access-Control-Allow-Origin 标头值,以允许来自所有域的访问请求,或为指定域的所有访问请求指定一个命名域。

    3. 选择 Enable CORS and replace existing CORS headers

     选择允许的标头

    注意

    如果在代理集成中将以上说明应用于 ANY 方法,那么将不会设置任何适用的 CORS 标头。相反,您依赖于集成后端返回适用的 CORS 标头,如 Access-Control-Allow-Origin

  6. Confirm method changes 中,选择 Yes, overwrite existing values 以确认新的 CORS 设置。

    确认覆盖现有值

在 GET 方法上启用 CORS 后,如果资源中没有 OPTIONS 方法,则该方法将添加到资源中。OPTIONS 方法的 200 响应会自动配置为返回这三个 Access-Control-Allow-* 标头,以完成预检握手。此外,默认情况下,实际 (GET) 方法还会配置为在 200 响应内返回 Access-Control-Allow-Origin 标头。对于其他类型的响应,如果您不希望返回跨源访问错误,您将需要手动对其进行配置,以返回带有“*”或特定原始域名的 Access-Control-Allow-Origin' 标头。

与您的 API 的任何更新一样,您必须部署或重新部署 API 以使新设置生效。

使用 API Gateway 导入 API 为资源启用 CORS

如果您使用的是 API Gateway 导入 API,您可以使用 Swagger 文件设置 CORS 支持。您必须先在您的资源中定义可返回所需标头的 OPTIONS 方法。

注意

Web 浏览器预计接受 CORS 请求的每个 API 方法中会设置 Access-Control-Allow 标头和 Access-Control-Allow-Origin 标头。此外,某些浏览器首先向同一资源中的 OPTIONS 方法发出 HTTP 请求,然后预计收到相同的标头。

以下示例创建了一个 OPTIONS 方法,并指定了模拟集成。有关更多信息,请参阅 在 API Gateway 中设置模拟集成

/users options: summary: CORS support description: | Enable CORS by returning correct headers consumes: - application/json produces: - application/json tags: - CORS x-amazon-apigateway-integration: type: mock requestTemplates: application/json: | { "statusCode" : 200 } responses: "default": statusCode: "200" responseParameters: method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'" method.response.header.Access-Control-Allow-Methods : "'*'" method.response.header.Access-Control-Allow-Origin : "'*'" responseTemplates: application/json: | {} responses: 200: description: Default response for CORS method headers: Access-Control-Allow-Headers: type: "string" Access-Control-Allow-Methods: type: "string" Access-Control-Allow-Origin: type: "string"

在您为资源配置 OPTIONS 方法后,可以将所需的标头添加到同一资源中需要接受 CORS 请求的其他方法。

  1. Access-Control-Allow-OriginHeaders 声明为响应类型。

    responses: 200: description: Default response for CORS method headers: Access-Control-Allow-Headers: type: "string" Access-Control-Allow-Methods: type: "string" Access-Control-Allow-Origin: type: "string"
  2. x-amazon-apigateway-integration 标签中,为这些标头设置到静态值的映射:

    responses: "default": statusCode: "200" responseParameters: method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'" method.response.header.Access-Control-Allow-Methods : "'*'" method.response.header.Access-Control-Allow-Origin : "'*'"