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

Authenticate as admin to Cognito using Lambda IAM Role

我正在尝试使用 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:尝试使用回调而不是承诺。

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);
    });
};