API 带有 Express 的网关 Lambda,CORS 已启用但未从 Chrome 收到
API Gateway Lambda with Express, CORS are enabled but not received from Chrome
我一直在使用 SAM ( https://aws.amazon.com/serverless/sam/ ) NodeJS 和 Express 开发一个简单的后端。
我正在使用 sam cli
及其模板(基于 CloudFormation)部署堆栈。
我在处理 CORS 问题时遇到了很多麻烦。
这几天我一直在寻找答案,我尝试了很多解决方案,但都没有成功。
部分template.yml
,这里我定义了AWS::Serverless::Api
:
Properties:
Name: !Sub ${stackName}
StageName: Web
Cors:
AllowHeaders: "'*'"
AllowOrigin: "'*'"
AllowMethods: "'*'"
在app.js
里面我也定义了行
app.use(cors());
我正在使用包 const awsServerlessExpress = require('@vendia/serverless-express')
。
显然,当我通过 Postman 或 cURL 测试每个 API 时,它都能正常工作,当我在 Chrome 上(本地主机或部署在一些不同的主机上)进行相同的测试时,我得到了经典的CORS 错误:... has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
AWS 提供了解决 CORS 问题的指南,此处 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-test-cors.html 显示以使用 cURL 进行测试。
我像这样用 cUrl 做同样的测试:
curl -v -X OPTIONS https://<endpoint>/auth/login -H "x-api-key: <API_KEY>" -H "Origin: https://127.0.0.1:3000" \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type, Authorization
如我所见,我正确收到了 CORS headers:
我仍然不明白为什么 Chrome 中出现 CORS 错误。
更新:
我尝试了相同的 cURL 请求,省略了 x-api-key
header.
响应是:
和{"message":"Forbidden"}* Closing connection 0
我注意到 OPTIONS 请求的字段 API Key required 设置为 true。我尝试将其设置为 false
但卷曲结果是一样的。
我找到问题了!
我已经为所有 API 事件设置了 ApiKey 要求。
由于 OPTIONS 请求不发送任何身份验证 header,API 网关拒绝该请求,因此客户端永远不会看到正确的 OPTIONS 响应。
我认为这是 SAM template/Cloudformation
的错误
我一直在使用 SAM ( https://aws.amazon.com/serverless/sam/ ) NodeJS 和 Express 开发一个简单的后端。
我正在使用 sam cli
及其模板(基于 CloudFormation)部署堆栈。
我在处理 CORS 问题时遇到了很多麻烦。
这几天我一直在寻找答案,我尝试了很多解决方案,但都没有成功。
部分template.yml
,这里我定义了AWS::Serverless::Api
:
Properties:
Name: !Sub ${stackName}
StageName: Web
Cors:
AllowHeaders: "'*'"
AllowOrigin: "'*'"
AllowMethods: "'*'"
在app.js
里面我也定义了行
app.use(cors());
我正在使用包 const awsServerlessExpress = require('@vendia/serverless-express')
。
显然,当我通过 Postman 或 cURL 测试每个 API 时,它都能正常工作,当我在 Chrome 上(本地主机或部署在一些不同的主机上)进行相同的测试时,我得到了经典的CORS 错误:... has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
AWS 提供了解决 CORS 问题的指南,此处 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-test-cors.html 显示以使用 cURL 进行测试。
我像这样用 cUrl 做同样的测试:
curl -v -X OPTIONS https://<endpoint>/auth/login -H "x-api-key: <API_KEY>" -H "Origin: https://127.0.0.1:3000" \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type, Authorization
如我所见,我正确收到了 CORS headers:
我仍然不明白为什么 Chrome 中出现 CORS 错误。
更新:
我尝试了相同的 cURL 请求,省略了 x-api-key
header.
响应是:
和{"message":"Forbidden"}* Closing connection 0
我注意到 OPTIONS 请求的字段 API Key required 设置为 true。我尝试将其设置为 false
但卷曲结果是一样的。
我找到问题了! 我已经为所有 API 事件设置了 ApiKey 要求。
由于 OPTIONS 请求不发送任何身份验证 header,API 网关拒绝该请求,因此客户端永远不会看到正确的 OPTIONS 响应。 我认为这是 SAM template/Cloudformation
的错误