我正在尝试使用SDK通过Lambda函数对Cognito用户池执行管理员操作,但是我无法确定如何正确地以管理员身份进行身份验证。理想情况下,我只想使用我的函数已经使用的执行角色,但是我还没有设法使它起作用,并且不确定是否可能。如果有可能,我需要怎么做才能使其正常工作?如果不可能,实现此目标的正确方法是什么?我必须在用户池中创建一个管理员用户,然后使用用户名和密码进行身份验证吗?
编辑:我已经用下面的代码实现了Matt的建议,但是我只是从Cognito那里得到了一个空对象(字面上只是{}出现在日志中),我不确定为什么。通过阅读documentation,我应该得到数据或错误。更新正在进行中,所以我知道它正在运行,我只是希望得到确认,所以有人知道我是否应该找回东西吗?
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;
}
});
答案 0 :(得分:1)
如果您想使用已经与Lambda函数绑定的IAM角色,只需在AWS控制台中编辑该角色并在该角色上添加适当的策略(取决于您要完成的工作)。
例如,您可以将预配置的“ AmazonCognitoPowerUser”策略添加到角色(请参见下文):
/**
* @param $value
*/
public function setExpiryDateAttribute($value)
{
$this->attributes['expiry_date'] = Carbon::createFromFormat('Y-m-d', $value)
->endOfDay()
->toDateTimeString();
}
或者更好的做法是,在lambda函数所需的特定资源上添加所需的特定策略规则,作为新策略。
执行此操作后,您可以直接调用Cognito Admin API(请参见下面的示例):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cognito-identity:*",
"cognito-idp:*",
"cognito-sync:*",
"iam:ListRoles",
"iam:ListOpenIdConnectProviders",
"sns:ListPlatformApplications"
],
"Resource": "*"
}
]
}