在 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?