使用Lambda IAM角色以管理员身份验证Cognito



我正试图使用SDK从Lambda函数对我的Cognito用户池执行管理操作,但我无法正确地验证为管理员。理想情况下,我希望只使用我的函数已经使用的执行角色,但我还没有成功实现,也不确定这是否可能。如果可能的话,我需要做些什么才能让它发挥作用?如果不可能,实现这一目标的正确方法是什么?我必须在用户池中创建一个管理员用户,然后使用用户名和密码进行身份验证吗?

编辑:我已经用下面的代码实现了Matt的建议,但我只是从Cognito得到了一个空对象(实际上只是{}出现在日志中),我不知道为什么。通过阅读文档,我应该得到要么是数据,要么是错误。更新正在进行,所以我知道它在起作用,我只是希望得到确认,有人知道我是否应该得到一些回复吗?

let cogUser;
const params = {
UserAttributes: [{ 
Name: "email",
Value: args.input.email
}],
UserPoolId: context.userpool_id,
Username: context.user
};
log.debug('Cog user params: ', params);
try {
cogUser = await context.conns.cognito.adminUpdateUserAttributes(params).promise();
} catch(err) {
log.error('Coguser threw error: ', err);
}
log.debug('Coguser return: ', cogUser);

编辑2:尝试使用回调而不是promise。

context.conns.cognito.adminUpdateUserAttributes(params, function(err, data) {
if (err) { 
console.log(err) 
} else {
cogUser = data;
}
});

如果您想使用已经绑定到Lambda函数的IAM角色,您只需在AWS控制台中编辑该角色,并在该角色上添加适当的策略(取决于您要完成的任务)。

例如,您可以将预先配置的"AmazonCognitoPowerUser"策略添加到角色中(见下文):

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cognito-identity:*",
"cognito-idp:*",
"cognito-sync:*",
"iam:ListRoles",
"iam:ListOpenIdConnectProviders",
"sns:ListPlatformApplications"
],
"Resource": "*"
}
]
}

或者,将lambda函数所需的特定资源上所需的具体策略规则添加为新策略。

完成此操作后,您可以直接调用Cognito Admin API(参见下面的示例):

exports.handler = (event, context, callback) => {
var AWS = require('aws-sdk');
var CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});
var params = {
UserAttributes: [{
Name: `custom:${event.attribute}`,
Value: event.value
}],
UserPoolId: 'us-east-1_example',
Username: event.username
}
CognitoIdentityServiceProvider.adminUpdateUserAttributes(params, function(err, data) {
if (err) { console.log(err) }
context.done(null, data);
});
};

相关内容

  • 没有找到相关文章