我创建了一个lambda,用于检索用户属性(用户名,电子邮件,名称等)但是,我想知道如何获取用户属性而不显式硬编码子值以获取所有用户属性其他相关属性?我是否需要在前端解码JWT Cognito令牌并在lambda中使用它来确定正确的用户并检索相关属性?
这是我在Node.JS中的lambda:
const AWS = require('aws-sdk');
exports.handler = function(event, context) {
var cog = new AWS.CognitoIdentityServiceProvider();
var filter = "sub = \"" + "UserSUB" + "\"";
var req = {
"Filter": filter,
"UserPoolId": 'POOL here',
};
cog.listUsers(req, function(err, data) {
if (err) {
console.log(err);
}
else {
if (data.Users.length === 1){
var user = data.Users[0];
var attributes = data.Users[0].Attributes;
console.log(JSON.stringify(attributes));
} else {
console.log("error.");
}
}
});
}
答案 0 :(得分:0)
我认为这样做的正确方法取决于您是否要使用API网关(这将使事情变得更简单)。
如果您不想要使用APIG,并且您使用临时凭证直接调用lambda,那么您应该传递整个ID令牌并让lambda执行所有验证和解码(可能使用JWT的第三方库)。在前端执行它并不安全,因为这意味着你有一个lambda盲目接受属性作为前端的事实,恶意用户可以根据需要改变它们。
如果您使用API网关将lambdas放在API之后,那么我将基于用户池创建一个cognito授权者,创建一个资源/方法并将其配置为使用授权者,并为此创建Use Lambda Proxy Integration
Integration Request
。所有为客户启用的令牌声明都将在event.requestContext.authorizer.claims
上传递,只要它有效。
有一些AWS文档here,虽然这不使用代理集成。如果您使用代理集成,那么您可以跳过6b,因为APIG将为您设置值。这在答案here中有所描述。