使用 API Key 或 Authorizer 授权 AWS API Gateway

Posted

技术标签:

【中文标题】使用 API Key 或 Authorizer 授权 AWS API Gateway【英文标题】:Authorize AWS API Gateway with either API Key or Authorizer 【发布时间】:2020-09-21 14:15:43 【问题描述】:

在 AWS API 网关中, - 我们可以设置资源来要求 API Key 进行访问。 - 我们还可以设置另一个需要授权的资源(例如 JWT 令牌,通过 lambda 函数或 AWS Cognito 处理)。

问题:我们能否将资源配置为在上述两种情况下都可以访问?目前,如果我们同时启用“API Key Required”和“Authorization”,请求需要API Key和Authorization。我们希望它只通过两者中的一个。

Hack/workaround:为同一资源创建两个副本,并分别对每个副本进行授权,一个使用 API Key,另一个使用授权者。

【问题讨论】:

你好,我有完全相同的情况,到目前为止我已经挣扎了几个小时。你能告诉我你是怎么解决的吗?非常感谢提前。我看到了您的破解/解决方法,但也许您知道如何使用一种资源来实现它? 我实现了一个 lambda 函数并将其用作授权方。这给了我足够的灵活性来进行各种 JWT 授权以及 apikey 身份验证。 【参考方案1】:

让授权人generate/map the API key for you

您有一个 Lambda 授权方返回 API 密钥作为 授权响应。有关授权的更多信息 响应,请参阅来自 Amazon API Gateway Lambda 授权方的输出。

优点:

单端点

API 密钥更多的是用于使用计划而不是授权。保持这种状态。

缺点:

Authorizer 将对每个请求运行。哪个要花钱

【讨论】:

我们正在使用 cognito 进行授权。您如何建议我们将 cognito 与 lambda 授权器集成?这不会太复杂/冗余吗? 我们使用 API Key 进行授权的原因:我们有一些内部服务,我们不想通过登录和获取 JWT 流程。所以,我们改用 API Key。 通过“使用 cognito 进行授权”,我的理解是您获得了 cognito 的身份令牌或访问令牌并将其提供到发送到 APIGW 的请求的授权标头中。如果是这种情况,您将需要删除 API GW 上的 cognito 自动身份验证并使用 Lambda 手动处理。这不是特别难,但是是的,它确实增加了更多的复杂性。 @qkhanhpro,嘿,谢谢你的回答。我只是不明白如何在我的自定义 Lambda 授权方中验证 Cognito 的身份令牌。我不知道 Cognito 是如何解码这个令牌的。那么,我该如何手动处理呢?如何创建签名来验证令牌?当我在我的用户池中创建应用程序客户端时,我未选中“生成客户端密码”,因为我直接从我的网络应用程序进行调用,并且“Cognito”授权方会检查所有内容。也许,在我想手动验证它的情况下,我需要这个值?还是这个客户机密有其他用途?谢谢。 @VladyslavTurak 对所有 JWT 令牌的方式相同。但是这里有一些示例代码和 AWS 提供的文档github.com/awslabs/aws-support-tools/tree/master/Cognito/…【参考方案2】:

AuthenticationIdentificationAuthorization是相互交织的概念。随着我对 Auth 的了解越来越多,这是我的答案:

API 密钥用于项目/应用程序识别和授权 JWT 用于用户身份验证和授权。 API 密钥在项目/应用程序范围内,JWT 在用户范围内。换言之,API Key 只识别应用程序,而不是应用程序的用户。

因此,不要使用 JWT 和 API Key 授权同一端点是有意义的,因为它会降低用户和应用程序的治理粒度。但是,如果您的用例需要这种类型的授权,建议的解决方法可能会奏效。

【讨论】:

以上是关于使用 API Key 或 Authorizer 授权 AWS API Gateway的主要内容,如果未能解决你的问题,请参考以下文章

如何允许 API Gateway 代理与 Cognito Authorizer 集成以进行 POST 请求?

如何为 AWS API Gateway Custom Authorizer 提供 Lambda 权限?

AWS Api Gateway Authorizer + Cognito 用户池不工作 "message": "Unauthorized"

Google 数据 API 授权重定向 URI 不匹配

具有 Cognito 用户池授权方的 AWS SAM API

前后端分离开发,HTTP API 认证授权术