为 REST API 资源启用 CORS - Amazon API Gateway
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

为 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 示例,请参阅 GitHub

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

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

以下示例使用 AWS 无服务器应用程序模型 (AWS 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 代理示例返回与 AWS 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) }