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

为 API Gateway REST API 资源启用 CORS

跨源资源共享 (CORS) 是一项浏览器安全功能,该功能限制从在浏览器中运行的脚本启动的跨源 HTTP 请求。如果您的 REST API 的资源接收非简单跨源 HTTP 请求,您需要启用 CORS 支持。

确定是否启用 CORS 支持

跨源 HTTP 请求将向以下项发出:

  • 一个不同的(例如,从 example.comamazondomains.com

  • 一个不同的子域(例如,从 example.competstore.example.com

  • 一个不同的端口(例如,从 example.comexample.com:10777

  • 一个不同的协议(例如,从 https://example.comhttp://example.com

跨源 HTTP 请求可分为两种类型:简单 请求和非简单 请求。

如果满足以下所有条件,则 HTTP 请求为简单

  • 其针对仅允许 GETHEADPOST 请求的 API 资源发出。

  • 如果它是一个 POST 方法请求,则它必须包含 Origin 标头。

  • 请求负载内容类型为 text/plainmultipart/form-dataapplication/x-www-form-urlencoded

  • 请求不包含自定义标头。

  • 简单请求的 Mozilla CORS 文档中列出的任何其他要求。

对于简单跨源 POST 方法请求,来自您的资源的响应需要包含标头 Access-Control-Allow-Origin,其中,标头键设置为 '*'(任何源)或设置为允许访问该资源的源。

所有其他跨源 HTTP 请求均为非简单 请求。如果您的 API 的资源接收非简单请求,您将需要启用 CORS 支持。

启用 CORS 支持意味着什么

当浏览器接收非简单 HTTP 请求时,CORS 协议将要求浏览器在发送实际请求之前向服务器发送一个预检请求,并等待服务器的批准(或请求凭证)。预检请求 将向您的 API 显示为 HTTP 请求:

  • 包含一个 Origin 标头。

  • 使用 OPTIONS 方法。

  • 包含以下标头:

    • Access-Control-Request-Method

    • Access-Control-Request-Headers

因此,为了支持 CORS,REST API 资源需要实施一个 OPTIONS 方法,该方法可以响应 OPTIONS 预检请求,该请求至少具有由 Fetch 标准强制执行的以下响应标头:

  • Access-Control-Allow-Methods

  • Access-Control-Allow-Headers

  • Access-Control-Allow-Origin

启用 CORS 支持的方式取决于您的 API 的集成类型。

为模拟集成启用 CORS 支持

对于模拟集成,您可创建一个 OPTIONS 方法以将所需的响应标头(具有适当的静态值)作为方法响应标头返回,从而启用 CORS。此外,每个实际启用了 CORS 的方法还必须在至少其 200 次响应中返回 Access-Control-Allow-Origin:'request-originating server addresses' 标头,其中标头键的值设置为 '*'(任何源)或设置为允许访问该资源的源。

为 Lambda 或 HTTP 非代理集成和 AWS 服务集成启用 CORS 支持

对于 Lambda 自定义(非代理)集成、HTTP 自定义(非代理)集成或 AWS 服务集成,您可以通过使用 API Gateway 方法响应和集成响应设置来设置所需的标头。API Gateway 将创建一个 OPTIONS 方法并尝试将 Access-Control-Allow-Origin 标头添加到您现有的方法集成响应中。这并不总是有用,有时您需要手动修改集成响应来适当地启用 CORS。通常,这仅意味着手动修改集成响应将返回 Access-Control-Allow-Origin 标头。

为 Lambda 或 HTTP 代理集成启用 CORS 支持

对于 Lambda 代理集成或 HTTP 代理集成,您仍可以在 API Gateway 中设置所需的 OPTIONS 响应标头。然而,您的后端将负责返回 Access-Control-Allow-OriginAccess-Control-Allow-Headers 标头,因为代理集成不会返回集成响应。

以下 Node.js Lambda 函数示例已配置为返回所需的 CORS 标头:

'use strict'; exports.handler = function(event, context) { var responseCode = 200; var response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value", "Access-Control-Allow-Origin": "my-origin.com" }, body: JSON.stringify(event) }; context.succeed(response); };

更完整的 Node.js 示例可在 https://github.com/awslabs/serverless-application-model/blob/master/examples/2016-10-31/api_swagger_cors/index.js 处找到。

以下 Python 代码段示例返回所需的 CORS 标头:

response["headers"] = { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }

以下示例使用无服务器应用程序模型 (SAM) 返回 CORS 所需的标头,包括 AllowHeaders

Globals: Api: # Allows an application running locally on port 8080 to call this API Cors: AllowMethods: "'OPTIONS,POST,GET'" AllowHeaders: "'Content-Type'" AllowOrigin: "'http://localhost:8080'"

以下 Lambda 代理示例返回与 SAM 示例相同的标头:

return { 'statusCode': 200, 'headers': { "Access-Control-Allow-Origin": "http://localhost:8080", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "OPTIONS,POST,GET" }, 'body': json.dumps(response) }

测试 CORS

您可以通过为您正在使用的实际方法和源标头自定义以下 cURL 命令来测试 CORS:

curl -v -X OPTIONS -H "Access-Control-Request-Method: POST" -H "Origin: http://example.com" https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}

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

您可以使用 API Gateway 控制台为已创建的 REST API 资源上的一个或所有方法启用 CORS 支持。

重要

资源可以包含子资源。为某个资源及其方法启用 CORS 支持不会以递归方式为子资源及其方法启用它。

在 REST API 资源上启用 CORS 支持

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

  2. API 列表中选择 API。

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

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

  4. 操作下拉菜单中选择 Enable CORS (启用 CORS)

    
                        选择“Enable CORS (启用 CORS)”
  5. Enable CORS (启用 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 (启用 CORS 并替换现有 CORS 标头)

    
                        选择允许的标头

    重要

    如果在代理集成中将以上说明应用于 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 标头。对于其他类型的响应,如果您不希望返回 Cross-origin access 错误,您将需要手动对其进行配置,以返回带有“*”或特定源的 Access-Control-Allow-Origin' 标头。

在您的资源上启用 CORS 支持后,您必须部署或重新部署 API 以使新设置生效。有关更多信息,请参阅从 API Gateway 控制台部署 REST API