【问题标题】:Building a billable API by linking API Keys, Usage Plans and Cognito通过链接 API 密钥、使用计划和 Cognito 构建可计费 API
【发布时间】:2020-05-04 11:43:48
【问题描述】:

我一直在使用 AWS API Gateway、Lambda 和无服务器框架构建无服务器 REST API。我想建立一个用户注册的网站,选择一个 API 计划(免费、基本、专业)并获得相应的长期 API 密钥,他们可以使用它每月查询一定次数的无服务器 API。

我了解,使用 Cognito 和自托管 UI,您可以使用 CUP(Cognito 用户池)令牌轻松处理用户身份验证,这实际上是 Json Web 令牌。我想自动创建 API 密钥并将其关联到使用计划,然后关联到 Cognito 用户。

第一部分很简单:使用 AWS Javascript SDK,就这么简单:

var params = {
  keyId: 'whateverKeyId', /* required */
  keyType: 'API_KEY', /* required */
  usagePlanId: 'whateverUsagePlanId' /* required */
};
apigateway.createUsagePlanKey(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

我正在为第二部分苦苦挣扎...我应该将 API 密钥作为自定义属性添加到用户池吗?但是,我真的不知道如何检索 API 密钥。 documentation 不是很清楚。注册后将用户和 API Key 添加到我自己的 DynamoDB 数据库中(这真的是对 Cognito 的浪费)?

说实话,这看起来很常见,而且我花了三天时间在互联网上寻找解决方案但没有成功,这让我觉得有些东西我不明白......

提前感谢您的意见!

【问题讨论】:

  • 你好凯文,你有没有设法解决它?我现在正在努力解决同样的问题。我们如何为 Cognito 用户授予 API 密钥并在以后使用它?谢谢。
  • 不幸的是,我最终手动构建了集成...很抱歉我帮不了你。

标签: amazon-web-services aws-lambda amazon-cognito api-key


【解决方案1】:

将 API 密钥作为自定义属性添加到 Cognito 用户池中是一个不错的选择。

每次您的用户登录时,cognito 都会返回一个 JWT 格式的 ID 令牌。 从此令牌中,您可以检索 cognito 用户的自定义属性和默认属性。 您可以在此处找到有关 cognito 令牌的更多详细信息:

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

https://aws.amazon.com/premiumsupport/knowledge-center/decode-verify-cognito-json-token/

那么你可以做什么:

  1. 创建 AWS API 网关。创建授权方并将其与您的 AWS cognito 池连接。在每个 API 资源的请求方法中,选择这个新的授权者,以便在用户每次调用您的 API 时对其进行授权。
  2. 当您的用户登录 cognito 时,cognito 会以 JWT 格式返回我上面描述的 ID 令牌,在您进行 API 调用时将此 JWT 令牌作为您的标头传递。
  3. 如果您执行上述步骤,则此 JWT 令牌将传递给您的 Lambda 函数,并且在 lambda 函数中您可以检索 cognito 自定义属性(API 密钥):

    const API_ID = event.requestContext.authorizer.claims['custom:apiid'];
    

上述行从您的 API 授权标头中检索 JWT,然后检索您在 cognito 中创建的自定义属性,该属性称为“apiid”,或者您想命名它。

【讨论】:

  • 您好,感谢您的解释。在我的应用程序中,我对最终用户应用程序和使用 API 密钥的内部 API 请求使用相同的 API。在这种情况下我应该使用什么授权类型?据我了解,它应该是“Lambda”类型,而不是自行验证令牌的“Cognito”类型?如果我使用自定义授权(“Lambda”类型),我将能够验证 API 密钥,但如何验证用户登录时 Cognito 授予的访问令牌?我的意思是,我这里有 2 个流程:标准身份验证和 API 密钥身份验证。我怎样才能将它们结合起来?谢谢。
  • 当我创建应用程序客户端时,我取消选中“生成客户端密码”,因为我直接从我的网络应用程序进行调用,并且“Cognito”授权方会检查所有内容。据我了解,如果我想使用自定义 Lambda 授权方,我需要创建一个带有客户端密码的应用程序客户端,并稍后在我的授权方中使用它来验证令牌?在我的授权人中,我需要同时支持这两种流程:1) 来自 Web 应用程序的标准请求,2) 使用由 createUsagePlanKey 使用 API Gateway API 创建的 API 密钥的请求。我对么?谢谢你:)
  • 这可以扩展到数百万用户吗? API Gateway 的软限制是每个帐户 500 个 API 密钥。
  • @ Vladyslav - 您可以使用 cognito 授权器对您的用户进行身份验证,然后通过 Post authentication lambda 来处理 API 密钥。
  • @ Juanpazos - 每个帐户每个区域 500 个 API 密钥的软限制可以增加到每个区域每个帐户 10,000 个密钥。如果您有更多用户,想法是使用 AWS cognito 池(最多 4000 万用户)进行身份验证,然后使用 API 密钥(如果您只需要它们用于使用计划)。如果你有一个具体的案例,如果你把它放在这里,也许我可以提供进一步的帮助。
猜你喜欢
  • 2019-07-25
  • 2020-09-12
  • 1970-01-01
  • 2014-12-15
  • 2015-05-23
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多