我一直在使用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的浪费)?
老实说,这看起来很普通,我花了三天时间在整个互联网上寻找解决方案,但没有成功,这让我觉得有些事情我不理解...
感谢您的输入!
将API密钥作为自定义属性添加到Cognito用户池中是一个不错的选择。
每次用户登录时,cognito都会以JWT格式返回ID令牌。通过此令牌,您可以检索自定义属性和默认属性的Cognito用户属性。您可以在此处找到有关认知令牌的更多详细信息:
和
https://aws.amazon.com/premiumsupport/knowledge-center/decode-verify-cognito-json-token/
所以您可以做什么:
如果执行上述步骤,那么此JWT令牌将被传递到Lambda函数,并且在lambda函数内部,您可以检索cognito自定义属性(API密钥:]]
const API_ID = event.requestContext.authorizer.claims['custom:apiid'];
上面的行从API授权者标头中检索JWT,然后检索您在cognito中创建的自定义属性,该属性称为“ apiid”,或者您想为其命名。