【问题标题】:Authenticate as admin to Cognito using Lambda IAM Role使用 Lambda IAM 角色以管理员身份向 Cognito 进行身份验证
【发布时间】:2019-06-02 04:02:37
【问题描述】:

我正在尝试使用 SDK 从我的 Lambda 函数对我的 Cognito 用户池执行管理员操作,但我无法弄清楚如何正确地以管理员身份进行身份验证。理想情况下,我只想执行我的函数已经在使用的执行角色,但我还没有设法完成这项工作,并且不确定它是否可能。如果可能的话,我需要做什么才能使其工作?如果不可能,实现这一目标的正确方法是什么?是否必须在用户池中创建管理员用户,然后使用用户名和密码进行身份验证?

编辑:我已经用下面的代码实现了马特的建议,但我只是从 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;
    }
});

【问题讨论】:

    标签: javascript amazon-web-services aws-sdk amazon-cognito amazon-iam


    【解决方案1】:

    如果您想使用已绑定到 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);
        });
    };
    

    【讨论】:

    • 这对您很有帮助,谢谢,您对我发布的后续问题有什么想法吗?
    • 当您使用回调(如文档中所示)而不是等待/承诺时会发生什么?
    • 刚试了,看原帖的编辑,返回还是空的。
    • 在这种情况下,它可能会在回调完成之前到达您的 log.debug 语句。尝试完全按照我上面的方法做,看看是否适合你。
    • 复制粘贴您的代码并再次获得一个空对象。我会去 SDK 的问题页面询问一些澄清和改进的文档。
    猜你喜欢
    • 2016-12-22
    • 2011-09-18
    • 2013-07-10
    • 2022-11-11
    • 1970-01-01
    • 2018-04-05
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多