通过链接 API 密钥、使用计划和 Cognito 构建可计费的 API

Kév*_*ERO 10 api-key amazon-web-services amazon-cognito aws-lambda

我一直在使用 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
});
Run Code Online (Sandbox Code Playgroud)

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

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

预先感谢您的意见!

Xan*_*eou 8

将 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 认知池连接。在每个 for you API 资源的 Request 方法中,选择这个新的授权者,以便在用户每次调用您的 API 时对其进行授权。
  2. 当您的用户登录 cognito 时,cognito 会以 JWT 格式返回我上面描述的 ID 令牌,当您进行 API 调用时,将此 JWT 令牌作为标头传递。
  3. 如果执行上述步骤,则此 JWT 令牌将传递到您的 Lambda 函数,并且在 lambda 函数内您可以检索 cognito 自定义属性(API 密钥):

    const API_ID = event.requestContext.authorizer.claims['custom:apiid'];
    
    Run Code Online (Sandbox Code Playgroud)

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