AWS:对于需要 API 密钥的端点,总是从 API 网关获取“消息”:“禁止”

Posted

技术标签:

【中文标题】AWS:对于需要 API 密钥的端点,总是从 API 网关获取“消息”:“禁止”【英文标题】:AWS: Always Getting `"message": "Forbidden"` from API Gateway for Endpoints that Require an API Key 【发布时间】:2021-12-23 14:14:37 【问题描述】:

我们已经在 AWS 上部署了一个 Chalice 应用,在调用需要 API 密钥的端点时,我们收到了以下响应:


    "message": "Forbidden"

可以毫无问题地调用不需要 API 密钥的端点。

奇怪的是,我们过去能够毫无问题地调用需要 API 密钥的端点,所以我们还在考虑是 Chalice 或 AWS 更新导致了这个问题。

我们使用 Postman 将 API Key 作为请求中的 Header 传递:

x-api-key:我们的 API 密钥的值。

我们也没有在 CloudWatch 中获得任何日志,大概是因为该问题实际上并未调用端点。 AWS 甚至在请求到达我们的端点之前就阻止了它。

我们的 API Key 配置如下:

API 密钥:

ID:我们密钥的 ID。 名称:我们的密钥名称。 API 密钥:我们的密钥值。 已启用:已启用

相关使用计划:

ID:我们计划的 ID。 名称:我们计划的名称。 节流:无节流。 配额:无配额。

API 密钥和使用计划看起来配置正确,因此我们假设问题不在于 API 密钥本身。

来自 "Troubleshoot API Gateway 403 Forbidden errors" 文档:

如果 API 密钥无效(或者,我们假设不正确),我们将收到以下消息:

“指定的 API 密钥标识符无效”

但是,我们得到的是一般的“禁止”错误:

“禁止”

文档仅列出了导致此错误的三个可能原因:

    在 API 中激活 AWS WAF 时,Web 应用程序防火墙 (WAF) 过滤会阻止请求。

    在使用公共 DNS 名称从 Amazon Virtual Private Cloud (Amazon VPC) 中调用私有 API 时,请求中缺少“Host”或“x-apigw-api-id”标头。

    调用者在禁用默认端点后使用默认的 execute-api 端点调用 REST API。

我们认为上述原因均不适用于我们,原因如下:

    我们的 API 网关中没有配置 WAF(也没有 Web ACL)。

    我们不会从 Amazon VPC 中调用私有 API。

    我们没有禁用默认端点,而是使用默认调用 URL。

我们是否遗漏了什么,或者这可能是 Chalice 或 AWS 的问题?

【问题讨论】:

你是如何在请求中使用 api 密钥的? @DanielA.White 我们将它作为 x-api-key 标头传递。还在OP中添加了这个。谢谢! 【参考方案1】:

我们找到了问题的根源。

显然,我们的 API 密钥所绑定的使用计划是为另一个 API 配置的。

我们所要做的就是将我们的 API 添加到使用计划的关联 API 阶段。

【讨论】:

以上是关于AWS:对于需要 API 密钥的端点,总是从 API 网关获取“消息”:“禁止”的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway API 密钥与 Cors

使用 REST 客户端 POSTMAN 使用 api 密钥调用 AWS api 网关端点

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

从 API Gateway 获取 terraform 中 AWS lambda 的端点

如何在 AWS 中从 Java 生成签名

收到错误:AWS API 请求后缺少身份验证令牌