使用 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】:Authentication、Identification、Authorization是相互交织的概念。随着我对 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"