通过 API 网关为无服务器架构模型代理端点设置 CORS

Posted

技术标签:

【中文标题】通过 API 网关为无服务器架构模型代理端点设置 CORS【英文标题】:Setting CORS via API Gateway for Serverless Architecture Model Proxy Endpoint 【发布时间】:2017-06-16 08:30:04 【问题描述】:

我正在使用 AWS Visual Studio Toolkit 开发 C#/.Net 无服务器应用程序,但在弄清楚我在 CORS 配置方面缺少什么时遇到了一些麻烦。我的项目基于工具包中包含的 ASP.Net 示例,该示例将 API Gateway 配置为具有单个 API 端点,作为 ASP.Net Web API 框架的代理。

在 chrome 中测试这个应用程序(服务于本地节点项目)我得到No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

我知道这意味着我必须在 API Gateway 端点上配置 CORS,但我似乎遗漏了一些东西。我使用操作下拉菜单来启用 CORS...

但是我得到了一些错误并且问题仍然存在。

我使用 chrome 扩展程序(暂时)禁用了 CORS,并确认 API 端点在没有 CORS 的情况下正常工作。

那么我在这里错过了什么?在线设置 CORS 的示例通常没有设置使用这样的包罗万象的端点的说明,甚至将 GET 分解为自己的方法似乎也无济于事。

另外一个问题,如果我缺少一些 CORS 配置,有没有一种好方法可以将其集成到 serverless.template 文件或其他一些自动部署步骤中?

【问题讨论】:

【参考方案1】:

这与您的ANY 代理方法有关。如此处所述:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

注意 将上述说明应用于代理集成中的 ANY 方法时,将不会设置任何适用的 CORS 标头。相反,您依靠集成后端返回适用的 CORS 标头,例如 Access-Control-Allow-Origin

因此,您必须让后端 API 返回适当的 CORS 标头。

【讨论】:

我可能错了,但我认为 API Gateway 会在 OPTIONS 调用中返回 CORS 标头。这是您的后端需要返回 Access-Control-Allow-Origin 标头的实际调用。【参考方案2】:

您需要在您的服务器上拥有标头以及 api 网关。 请参阅此示例: - 将 cors 标头应用于静态存储桶网站

https://www.codeproject.com/Articles/1178781/Serverless-Architecture-using-Csharp-and-AWS-Amazo

【讨论】:

【参考方案3】:

要使 API 正常工作,必须做两件事: 1. options 方法必须正确设置 - 通常使用 API 网关上的模拟方法完成。 2. 代码中的 HTTP 方法实现必须正确返回 CORS 标头。搜索一下,这方面的文章不少。

对我来说,问题是第 1 点;当我使用 .NET Core 开发 API-Gateway Lambda 集成时,使用 API Gateway 的“启用 CORS”按钮对我不起作用。我也没有找到在 serverless.template 文件中添加创建选项方法的方法。

这是另一种方法;从 CLI 或 VisualStudio 发布 lambda 后,在 API 端点上触发 PUT 请求并传递包含选项方法 defs 的 swagger 定义,并确保设置查询参数 mode=merge。您可以使用 PostMan 来执行此操作。

您使用的 DotNet 实用程序与此处解释的功能相同: http://sbytestream.pythonanywhere.com/blog/Enabling-APIGateway-CORS 源代码也可以在 GitHub 上找到。

【讨论】:

以上是关于通过 API 网关为无服务器架构模型代理端点设置 CORS的主要内容,如果未能解决你的问题,请参考以下文章

网关架构设计最佳实践

用于事件驱动架构的 API 网关

有没有一种方法可以在不使用 APi 网关架构的情况下使用 Jwt 保护微服务端点

API 网关 - POST 多部分/表单数据

如何在 api 网关架构中获取 JWT 令牌

如何通过zuul或任何api网关调用安全的微服务端点