在 NodeJS Lambda 函数中列出 AWS.CognitoIdentityServiceProvider.listUsers 中的用户及其组?

erg*_*sto 3 amazon-web-services amazon-cognito aws-sdk-js

因此,我需要在客户端的自定义管理屏幕中显示用户列表及其各个组。我正在 Lambda 函数中返回结果AWS.CognitoIdentityServiceProvider.listUsers,并且可以很好地列出用户,但我不确定为每个用户获取组并将其添加到响应中的最佳方法。

对我来说,他们没有提供类似 listUsers 的方法来包含该信息,就个人而言,这似乎有点令人惊讶,因为这似乎是一个常见的用例。以前有人解决过这个问题吗?我有一个可行的解决方案,但它看起来很老套,而且可能性能不高,所以我正在寻找更有效的解决方案。

看来我的选择是要么获取用户池中的每个组并调用AWS.CognitoIdentityServiceProvider.listUsersInGroup每个组,然后循环遍历所有用户listUsers并检查他们是否属于这些组中的任何一个,或者循环遍历响应中的每个用户listUsersAWS.CognitoIdentityServiceProvider.adminListGroupsForUser调用他们每个人。这些是我唯一的选择吗?第一个选项似乎效率稍高,因为组数少于用户数,因此 API 调用也会减少,但看起来这仍然非常低效。

elb*_*bik 9

根据文档,我将采用以下解决方案:

  1. 组的数量肯定会低于用户的数量。因此更好的使用方法是:AWS.CognitoIdentityServiceProvider.listGroups
  2. 循环遍历组列表并从中检索用户。

代码示例:

const AWS = require('aws-sdk')

var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});

const USER_POOL_ID = 'region_XXXXXXXXX'

var params = {
    UserPoolId: USER_POOL_ID, /* required */
};
cognitoidentityserviceprovider.listGroups(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     {
        console.log('Groups list:')
        data.Groups.map(groups => {
            console.log(groups.GroupName)
        })

        data.Groups.map( groupEntity => {
            var params = {
                GroupName: groupEntity.GroupName, /* required */
                UserPoolId: USER_POOL_ID, /* required */
            };
            cognitoidentityserviceprovider.listUsersInGroup(params, function(err1, data1) {
                if (err1) console.log(err1, err1.stack); // an error occurred
                else {
                    console.log(`${groupEntity.GroupName} has ${data1.Users.length} users`);

                    data1.Users.map(userEntity => {
                        console.log(userEntity.Username)
                    })
                }
            });

        })
    }
});
Run Code Online (Sandbox Code Playgroud)