如何解决在 Serverless 中使用 API Gateway 跨域访问出现的问题?

阅读时长 3 分钟读完

在使用 Serverless 搭建应用的过程中,使用 API Gateway 进行跨域访问时会出现一些问题,本文将详细介绍此问题的原因以及解决方法,并提供相应示例代码。

问题原因分析

CORS(跨域资源共享)策略是前端应用中防止 XSS 攻击和 CSRF 攻击的一种非常有效的方式。然而,在 Serverless 架构中,由于 Gateway 的实现方式不同,会导致在前端应用请求后端服务时出现 CORS 跨域问题。

CORS 跨域问题的本质是由浏览器的安全策略造成,而在 Serverless 应用中,由于 Gateway 充当了前端应用和后端服务之间的代理,因此需要 Gateway 主动解决跨域问题。

目前,AWS Lambda 和 API Gateway 提供了两种解决方案:

  1. 使用 Gateway 提供的 CORS 支持。
  2. 在 Lambda 中添加自定义 header 以绕过 CORS 策略。

下面分别介绍这两种方式的实现方式。

方法一:使用 API Gateway 提供的 CORS 支持

API Gateway 提供了在创建 API 时进行 CORS 支持的选项,这种方法比较简单,但是只在 API 的根路径下提供跨域支持。

在 API 创建过程中,可以在跨域支持标签下勾选“启用 CORS”选项,在“Access-Control-Allow-Origin”、“Access-Control-Allow-Headers”和“Access-Control-Allow-Methods”三个参数中分别设置跨域请求所需的相关信息,如下所示:

方法二:使用自定义 header 绕过 CORS 策略

如果需要在 API 的子路径中提供跨域支持,或者需要同时处理多个 CORS 问题,则可以在 Lambda 中添加一个自定义 header 以绕过 CORS 策略。

在使用此方法之前,需要了解一些 AWS Lambda 和 API Gateway 的相关知识。Lambda 可以接受和处理以下类型的事件之一:

  1. API Gateway 发送的 HTTP 请求事件
  2. AWS Kinesis、AWS DynamoDB 等的事件流
  3. 在线编辑器和 AWS CLI 等工具发出的指令事件
  4. 可以由 CloudWatch 触发器触发的事件

Lambda 处理完事件后,可以返回 JSON 响应以便 API Gateway 接收并转发到客户端。在 Lambda 函数代码中,可以使用以下示例代码添加自定义响应 header:

在上述示例代码中,我们已经在 headers 属性中添加了自定义 header。这将告诉 API Gateway 在转发响应之前将自定义 header 添加到响应中。

结论

在 Serverless 应用中使用 API Gateway 进行跨域访问时,有两种可行的解决方法。

  1. 使用 API Gateway 提供的 CORS 支持,但是只能为 API 提供基本的跨域访问支持。
  2. 在 AWS Lambda 中使用自定义 header,并以 JSON 格式返回到 API Gateway。

在使用这两种方法时,需要注意一些限制和限制。使用这两种方法中的任何一种将有助于您快速解决 CORS 跨域访问问题。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676d5a9c82fcee791c67273c

纠错
反馈