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

问题描述 投票:1回答:1

我一直在使用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密钥添加到我自己的DynamoDB数据库中(这实际上是对Cognito的浪费)?

老实说,这看起来很普通,我花了三天时间在整个互联网上寻找解决方案,但没有成功,这让我觉得有些事情我不理解...

感谢您的输入!

amazon-web-services aws-lambda amazon-cognito api-key
1个回答
0
投票

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

每次用户登录时,cognito都会以JWT格式返回ID令牌。通过此令牌,您可以检索自定义属性和默认属性的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 Gateway。创建一个授权者并将其与您的AWS Cognito池连接。在每个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'];
    
  4. 上面的行从API授权者标头中检索JWT,然后检索您在cognito中创建的自定义属性,该属性称为“ apiid”,或者您想为其命名。

© www.soinside.com 2019 - 2024. All rights reserved.