在使用 Serverless 搭建应用的过程中,使用 API Gateway 进行跨域访问时会出现一些问题,本文将详细介绍此问题的原因以及解决方法,并提供相应示例代码。
问题原因分析
CORS(跨域资源共享)策略是前端应用中防止 XSS 攻击和 CSRF 攻击的一种非常有效的方式。然而,在 Serverless 架构中,由于 Gateway 的实现方式不同,会导致在前端应用请求后端服务时出现 CORS 跨域问题。
CORS 跨域问题的本质是由浏览器的安全策略造成,而在 Serverless 应用中,由于 Gateway 充当了前端应用和后端服务之间的代理,因此需要 Gateway 主动解决跨域问题。
目前,AWS Lambda 和 API Gateway 提供了两种解决方案:
- 使用 Gateway 提供的 CORS 支持。
- 在 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”三个参数中分别设置跨域请求所需的相关信息,如下所示:
Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token Access-Control-Allow-Methods: POST, OPTIONS, DELETE
方法二:使用自定义 header 绕过 CORS 策略
如果需要在 API 的子路径中提供跨域支持,或者需要同时处理多个 CORS 问题,则可以在 Lambda 中添加一个自定义 header 以绕过 CORS 策略。
在使用此方法之前,需要了解一些 AWS Lambda 和 API Gateway 的相关知识。Lambda 可以接受和处理以下类型的事件之一:
- API Gateway 发送的 HTTP 请求事件
- AWS Kinesis、AWS DynamoDB 等的事件流
- 在线编辑器和 AWS CLI 等工具发出的指令事件
- 可以由 CloudWatch 触发器触发的事件
Lambda 处理完事件后,可以返回 JSON 响应以便 API Gateway 接收并转发到客户端。在 Lambda 函数代码中,可以使用以下示例代码添加自定义响应 header:
const response = { headers: { 'Access-Control-Allow-Origin': '*', }, body: JSON.stringify({ message: 'Hello World' }), };
在上述示例代码中,我们已经在 headers 属性中添加了自定义 header。这将告诉 API Gateway 在转发响应之前将自定义 header 添加到响应中。
结论
在 Serverless 应用中使用 API Gateway 进行跨域访问时,有两种可行的解决方法。
- 使用 API Gateway 提供的 CORS 支持,但是只能为 API 提供基本的跨域访问支持。
- 在 AWS Lambda 中使用自定义 header,并以 JSON 格式返回到 API Gateway。
在使用这两种方法时,需要注意一些限制和限制。使用这两种方法中的任何一种将有助于您快速解决 CORS 跨域访问问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676d5a9c82fcee791c67273c