API Gateway v2 未从 OPTIONS 调用返回 CORS 标头

Posted

技术标签:

【中文标题】API Gateway v2 未从 OPTIONS 调用返回 CORS 标头【英文标题】:API Gateway v2 not returning CORS headers from OPTIONS call 【发布时间】:2021-11-17 04:24:55 【问题描述】:

当我从在 localhost 上运行的网站发送 POST 时,得到一个指向 Lambda 的 API Gateway v2,该 Lambda 遇到了 CORS 问题。作为故障排除的一部分,我正在使用 curl 模拟预检请求。它没有按我的预期工作。

这是我在 API 网关中的 CORS 设置(仅限开发,而非 PRD):

aws apigatewayv2 get-api --api-id=redacted的CORS部分

    "CorsConfiguration": 
        "AllowCredentials": false,
        "AllowHeaders": [
            "content-type"
        ],
        "AllowMethods": [
            "HEAD",
            "OPTIONS",
            "POST"
        ],
        "AllowOrigins": [
            "*"
        ],
        "MaxAge": 600
    ,

我正在使用这个脚本来查询它:

source='localhost'
dest='https://redacted.execute-api.us-west-2.amazonaws.com/redacted/'
verb='POST'
echo $source $dest $verb
curl -I -X OPTIONS \
  -H "Origin: $source" \
  -H "Access-Control-Request-Method: $verb" \
  -H "Access-Control-Request-Headers: origin" \
  "$dest"

回复是:

HTTP/2 204
date: Thu, 23 Sep 2021 18:03:25 GMT
apigw-requestid: GIMpJhH4PHcES5g=

通过阅读 MDN 文档 here 和 this answer here,我希望 API 网关返回包含 Access-Control-Allow-Origin 的响应。但我什么也得不到。将源更改为包含 http:// 并没有改变结果(我没想到会这样,我认为 CORS 在这种情况下只关心域)。

请注意,很多答案都涉及“您忘记部署它”——但 API Gateway v2 默认为“自动部署”,并且此实例使用该默认值——每次更改时都会部署它。

注意:我在我的 lambda 中设置了 API 网关指向的 'Access-Control-Allow-Origin': '*'"Content-Type": "application/json",,但我认为这还没有达到那么远,所以 lambda 现在不是问题的一部分。我是不是误会了?

如何使用 curl 检查 AWS API Gateway v2 上的 CORS?

我还应该为aws-api-gateway-v2 创建一个标签吗?它与 v1 有点不同,足以让 Terraform 使用不同的模块。

【问题讨论】:

这里有什么明显的错误吗? aws.amazon.com/premiumsupport/knowledge-center/… 如果你调用 aws apigatewayv2 get-api 会发生什么——CorsConfiguration 块看起来还可以吗? 是的,我昨天发现了那篇故障排除文章,没有看到我遗漏的任何内容。将aws apigatewayv2 get-api 的结果添加到问题中。 还添加了更多标头并重新部署:“content-type”、“x-amz-date”、“x-amz-security-token”、“authorization”、“x- api-key","x-requested-with","accept","access-control-allow-methods", "access-control-allow-origin", "access-control-allow-headers" -- 没有变化 在黑暗中拍摄:尝试使用 localhost 以外的 Origin。 在 google.com 上尝试了一些关于 Origin 的变体,没有运气 【参考方案1】:

这归结为被拒绝的标题。简短版本:API 网关中任何被拒绝的标头都会导致 404。这是一个有效的curl

curl 'https://redacted.execute-api.us-west-2.amazonaws.com/redacted' -I \
  -X 'OPTIONS' \
  -H 'authority: redacted.execute-api.us-west-2.amazonaws.com' \
  -H 'accept: */*' \
  -H 'access-control-request-method: POST' \
  -H 'access-control-request-headers: content-type' \
  -H 'origin: http://localhost:8080' \
  -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/94.0.4606.81 Safari/537.36' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: http://localhost:8080/' \
  -H 'accept-language: en-US,en;q=0.9' \
  --compressed

【讨论】:

以上是关于API Gateway v2 未从 OPTIONS 调用返回 CORS 标头的主要内容,如果未能解决你的问题,请参考以下文章

云原生 API 网关,gRPC-Gateway V2 初探

AWS API Gateway OPTIONS 请求返回 500 错误

AWS Api Gateway 仅在 OPTIONS 调用时不响应 CORS 标头

AWS API Gateway CORS 对 OPTIONS 正常,对 POST 失败

当 OPTIONS 请求的 statusCode 为 200 时,为啥我会在 API Gateway GET 请求中收到 CORS 错误?

AWS API Gateway 仅在使用 SAM 时支持 CORS for OPTIONS(没有 Lambda 代理集成)