如何在 AWS Gateway 上针对特定内容类型的所有请求实施 JSON 架构模型?

How do I enforce a JSON Schema model on AWS Gateway for all requests of a certain content type?

我已成功设置 AWS 网关以使用 JSON 架构验证 body 传入的 POST 请求。我太激动了!万岁我想......当我使用内部AWS工具测试功能......但后来我使用AJAX测试了来自网站的POST请求w/invalid数据,然后是CURL请求,再次使用无效数据 - 你不知道吗,它们都通过了我的集成并触发了我的 AWS Lambda 函数,JSON 架构应该阻止!我已将最新的 API 部署到我的端点,甚至将所有 "Content-Type" headers 调用设置为相同的 JSON Schema AWS 模型。我对发生的事情一头雾水......我如何强制所有请求必须是一个 content-type 或 return 一个错误?

在此先感谢您提供的任何帮助...

我的问题的答案,供那些偶然发现此问题的人使用。

默认情况下,JQuery 的“.post”方法将 Content-Type 设置为 "application/x-www-form-urlencoded." 我在 AWs Gateway 中设置的模型仅适用于 "application/json" POST 个请求。我假设如果我将 "request validator" 设置为对特定 content-type 使用 JSON 架构模型,那么只有我定义的模型才允许通过...哦,不,不,不! AWS 网关方便地让任何其他 Content-Type 未经检查地通过,绕过我的 JSON 模式模型验证器。实际上令人难以置信。因此,仅强制执行 application/json 的答案是移动到 "integration request" 并为 application/json 配置 body 映射,将 "When there are no templates defined (recommended)" 选项设置为 true。瞧,问题解决了。 AWS Gateway 仍将允许您的 POST 请求进入此阶段,但不会进入您的“操作(例如 Lambda 函数)”。

我想补充一点……这不再是问题,但即使通过设置多个 Content-Type 模式,该模型也只在 AWS Gateway 中的第一个模式上强制执行。奇怪的行为...也许有人可以提供帮助 w/this?

使用适当的设置可以正常工作。正确设置您的模型,包括您希望应用的验证。 对于您的方法,转到方法执行部分并设置

  1. 设置 -> 请求验证器 - select 选项为 'Validate Body'。您可以根据您的要求选择其他合适的选项。
  2. 请求正文 -> 创建新条目作为 'application/json' 和 select 您的模型。

完成。这将按预期工作,并为其他 Content-Type 或模型验证失败时抛出 500 错误。 此外,您始终可以在 Lambda 的入口函数中验证请求。尽管这是您要避免避免 lambda 触发成本的情况。

附加提示:确保您已正确设置 API 速率限制,因为如果您的 API 被 spammers/attackers 捕获,您将被收费,尽管通过模型验证会保护您,但是AWS 仍会向您收费。在 API 密钥集的情况下,这仍然适用。