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

时间:2019-01-07 13:21:16

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

我正在尝试使用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;
    }
});

1 个答案:

答案 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": "*"
        }
    ]
}