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

的错误