Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)

Posted

技术标签:

【中文标题】Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)【英文标题】:Cors - how to handle preflight options request that requires a custom header? (AWS: private API gateway using a vpc endpoint) 【发布时间】:2020-01-09 03:51:55 【问题描述】:

我已经看到有关此的帖子,但没有任何问题或答案与我的问题足够接近以提供有效答案。

我无法通过浏览器向 API 发送请求。

据我了解,问题是当您向 API 网关发送请求时;浏览器将首先发送一个预检选项请求。此预检请求不会添加任何自定义标头,即:x-apigw-api-id 标头。然后,这会导致返回 403,甚至没有点击选项请求。

我的理解是客户端无法控制预检请求,由浏览器处理。

get 请求通过邮递员工作,选项请求也是如此,但前提是我为每个请求添加 x-apigw-api-id 标头。

通过邮递员返回的标头,并在请求中添加了x-apigw-api-id

"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET,OPTIONS","Access-Control-Allow-Headers":"Content-Type,X-Api-Key,","Content-Type":"application/json"

我删除标题我得到一个403 forbidden

是否有解决此问题的方法?发送选项请求时可能不需要 x-apigw-api-id?

发帖前我查了一些问题:

API Gateway CORS: no 'Access-Control-Allow-Origin' header Can't use custom Request Headers on AWS API Gateway with CORS request api gateway cors error AWS API Gateway No 'Access-Control-Allow-Origin' header is present AWS API Gateway endpoint gives CORS error when POST from static site on S3

【问题讨论】:

你有什么答案吗? 不,我还没有找到解决方案。我正在做的这部分工作已被搁置,因此我目前不对其进行调查,但我有兴趣找到解决方案。 【参考方案1】:

可以通过将 VPC 终端节点关联到您的私有 API 来解决此问题。这将为您的私有 API 生成一个 Route53 别名。从文档中,

当您将 VPC 终端节点与您的私有 API 相关联时,API Gateway 会生成一个新的 Route53 ALIAS DNS 记录,您可以使用它来调用您的私有 API,就像您调用边缘优化或区域 API 一样,而无需覆盖主机标头或传递一个 x-apigw-api-id 标头。

https://docs.aws.amazon.com/apigateway/latest/developerguide/associate-private-api-with-vpc-endpoint.html

【讨论】:

该记录只能从 VPC 内解析,这可能不是您的浏览器运行的位置。至少在我的情况下,我的笔记本电脑无法解析记录,即使我可以连接到 vpc 端点,所以这并不能解决它 @Ulrar 有两个 dns 名称,普通 API GW dns 名称,可通过 AmazonDNS 服务器解析。即,在 VPC 或混合网络中将解析转发到 AmazonDNS 服务器。另一种是公共 dns,它解析到 APIGW 端点的私有 IP。 对,我在 AWS 上开了一个案子,他们发现我是这样的:-.execute-api.us-east-1.amazonaws.com。该 URL 从任何地方解析为私有 IP,并且可以在浏览器中使用而无需设置 x-apigw-id 标头【参考方案2】:

基于 Ulrar 公开的解决方案。私有 API 网关在不使用任何附加标头的情况下公开发出请求的选项。此 URL 由以下人员组成:

https://< api-id >-< vpce-id >.execute-api.< region >.amazonaws.com

此解决方案对于直接浏览器集成中的 CORS 问题很有用。

【讨论】:

谢谢,这对我有用 :) 这假设您启用了私有 DNS。更多信息在这里:docs.aws.amazon.com/apigateway/latest/developerguide/…,也在这里:docs.aws.amazon.com/apigateway/latest/developerguide/…

以上是关于Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理无效的 CORS 预检请求?

Spring Data REST CORS - 如何处理预检选项请求?

如何处理 OPTIONS 请求中的自定义标头

如何在 CORS 预检 OPTIONS 请求中发送自定义标头?

如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?

是否可以手动预检多个 CORS 资源?