【问题标题】:Authorize AWS API Gateway with either API Key or Authorizer使用 API Key 或 Authorizer 授权 AWS API Gateway
【发布时间】: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 身份验证。

标签: amazon-web-services api aws-api-gateway api-key api-gateway


【解决方案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 授权同一端点是有意义的,因为它会降低用户和应用程序的治理粒度。但是,如果您的用例需要这种类型的授权,建议的解决方法可能会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2017-04-13
    • 2019-12-25
    • 2019-12-28
    • 2020-03-17
    相关资源
    最近更新 更多