在 Amazon API Gateway 中使用 API 密钥

Posted

技术标签:

【中文标题】在 Amazon API Gateway 中使用 API 密钥【英文标题】:Using an API key in Amazon API Gateway 【发布时间】:2016-12-27 21:55:17 【问题描述】:

我创建了一个 API 密钥并将其添加到我的函数中。然后我已经部署了 api 并对其进行了测试,但仍然得到:

"message": "Forbidden"

我一直在使用“x-api-key”:“theKey”,如何通过 JSON 请求传递 api 密钥?

【问题讨论】:

这个post 为我解释了它! 【参考方案1】:

我必须添加一个 API 使用计划,然后将该计划链接到 API 阶段。

似乎这是将密钥链接到 API 的唯一方法,不确定这是否是 AWS 上的最新更改。

【讨论】:

我刚刚遇到了同样的问题。我花了半个小时才弄清楚发生了什么事。这个糟糕的错误消息:"message":"Forbidden" 根本没有帮助。谢谢 AWS! 经典 AWS。只是错过了文档的重要部分,并且不要告诉您错误消息中的问题是什么或如何解决它。谢谢,这为我解决了。 这对我有帮助。 别忘了再次部署! 我找到解决方案的方法是激活日志记录。这需要具有 AmazonAPIGatewayPushToCloudWatchLogs 权限的 apigateway 角色。在日志中,消息实际上很清楚:“API Key ***** 未授权,因为方法 'POST /predict' 需要 API Key 并且 API Key 与 API 阶段 x______y/stg 的使用计划没有关联:无使用为密钥和 API 阶段找到计划”【参考方案2】:

x-api-key 参数作为 HTTP 标头参数传递(即它不添加到 JSON 正文中)。您传递 HTTP 标头的方式取决于您使用的 HTTP 客户端。

例如,如果您使用 curl 并假设您 POST JSON 有效负载,则请求将类似于(您将 [api-id] 替换为实际 ID,将 [region] 替换为 API 的 AWS 区域) :

$ curl -X POST -H "x-api-key: theKey" -H "Content-Type: application/json" -d '"key":"val"' https://[api-id].execute-api.[region].amazonaws.com

【讨论】:

是的,我在 ios sdk 中使用了 NSMutableURLRequest *request,然后你也可以添加密钥,它就可以工作了 有没有办法使用我们自己的自定义标头名称而不是“x-api-key”标头名称? 在 2021 年仍然相关 - 您会认为 AWS 文档会更具体地说明如何(例如在 Postman 中)提供 API 密钥来测试此功能【参考方案3】:

如果您将“需要 API 密钥”选项设置为 true,请检查以下内容。

    您必须将“x-api-key”HTTP 标头参数传递给 API 网关。

    必须创建 API 密钥。

    另外,您需要在 API Gateway 控制台上查看 API Key 的使用计划。

【讨论】:

谢谢。我认为 aws 文档并不清楚提及这一点。 在我创建使用计划之前,它对我不起作用。我猜这不应该是必要的。谢谢!【参考方案4】:

如果将 'API' key required 设置为 true,则需要将 api 密钥作为标头传递。

API 密钥作为标头字段“x-api-key”传递。即使在标题中添加此字段后,也可能会出现此问题。在这种情况下,请验证以下几点

    您有使用计划吗?如果不需要创建一个。 将您的 API 与使用计划相关联。为此添加一个阶段,它将链接您的 API 您有 API 密钥吗?如果不是,您需要创建一个 API 密钥并启用它。 将与您的 API 链接的使用计划添加到此 API 密钥。为此,请添加使用计划。

【讨论】:

很棒的笔记。谢谢。【参考方案5】:

希望您不要错过将 API 密钥与 API 关联起来

【讨论】:

【参考方案6】:

我能够在 Postman 本机应用程序中使用以下配置从 Lambda 获得成功的响应 -

在授权选项卡下(由于某种原因,当我在标题下传递相同的参数时,这不起作用)

密钥:x-api-key

值:你的 api 键值

添加到:页眉

【讨论】:

【参考方案7】:

对于通过公共 DNS 访问的私有 API 网关,我们需要传递额外的“x-apigw-api-id”标头以及 api id 以及“x-api-key”(如果已配置)。

curl -v https://vpce-id.execute-api.region.vpce.amazonaws.com/test -H 'x-apigw-api-id:api-id'

它记录在下面,

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-api-test-invoke-url.html#w20aac13c16c28c11

【讨论】:

我的问题是我错误地为公共 API 网关包含了这个 x-apigw-api-id 标头。删除它对我有用。【参考方案8】:

我没有足够的声誉将此设置为评论,但我终于能够找到指定“x-api-key”属于来自外部客户端的 API 网关调用的标头中的文档(例如邮递员、招摇等)在 AWS 文档中。

相关部分:

要使用标头来源的 API 密钥:

    使用所需的 API 方法创建 API。并将 API 部署到 阶段。 创建一个新的使用计划或选择一个现有的。添加部署的 使用计划的 API 阶段。将 API 密钥附加到使用计划或 选择计划中的现有 API 密钥。记下选择的 API 密钥 价值。 将 API 方法设置为需要 API 密钥。 将 API 重新部署到同一阶段。如果您将 API 部署到新的 阶段,确保更新使用计划以附加新的 API 阶段。

客户端现在可以在提供 x-api-key 的同时调用 API 方法 以所选 API 密钥作为标头值的标头。

Choose an API key source

【讨论】:

以上是关于在 Amazon API Gateway 中使用 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

ELB 和 ECS 集群前的 Amazon API Gateway

如何对 Amazon API Gateway 终端节点进行 CNAME

如何将参数从 POST 从 Amazon API Gateway 传递到 AWS Lambda

如何将 Cognito 令牌传递给 Amazon API Gateway?

有没有办法更改 Amazon API Gateway 返回的 http 状态代码?

Amazon API Gateway 和 AWS Lambda 中的错误处理模式