gpt4 book ai didi

javascript - 在 JavaScript 中从 Amazon Cognito API 中详尽选择所有用户的安全且可扩展的方法是什么?

转载 作者:行者123 更新时间:2023-11-30 19:54:05 24 4
gpt4 key购买 nike

我是一个小团队的一员,在一个有用户帐户的相当小的网站上工作;此时大约有 100 个用户。我们正在使用 Amazon Cognito 进行用户管理。在我们的网站上有一个摘要页面,其中显示了所有用户和各种属性的列表/表格。然而,there's a hard limit Amazon Cognito listUsers API 调用返回的项目数,在本例中为 60。

幸运的是,如果有更多用户,API 调用还会返回一个 token 以用于进行后续调用。使用这些 token ,我们能够请求所有用户的完整列表。

另外,我们的网站使用了 react-redux 和 javascript 库 bluebird。在这个问题的上下文中,请求所有用户列表的组件也分派(dispatch)操作(redux 片段)并且来自亚马逊 aws-sdk 的 CognitoIdentityServiceProvider 被传递给 bluebird Promise.promisfyAll(将异步后缀添加到 listUser 调用)。我正在修改此组件以获取整个用户列表。

作为请求整个用户列表的粗略草稿,我使用递归函数将 promise 链接在一起,直到从 Amazon 返回的分页 token 未定义并将结果存储在一些类变量中。我用了这个forum post as reference.

这行得通,但我对实现感觉不太好;现在在我们的用例中应该没问题,因为我们有大约 100 个用户,但我不知道这是否可以很好地扩展到数千个或更多用户。我知道递归足够危险,因为我不知道当 promise /调用的数量增加时这种技术是否会导致问题。我想到了开销和内存管理的问题。但是,我们不必担心用户数量至少在短时间内飙升至数千,但我仍然想了解实现相同目标的可能更可取和/或更安全的方法。

以下片段来自请求用户列表的组件:

import Promise from 'bluebird';
import { CognitoIdentityServiceProvider } from './services/aws';

export const fetchRegisteredUsers = () => (dispatch) => {
...

let allUsersTemp = [];
let paginationToken;

const getUserList = () => {
let tempUserTest = CognitoIdentityServiceProvider.listUsersAsync({
UserPoolId: process.env.COGNITO_USER_POOL_ID,
PaginationToken: paginationToken
});
return tempUserTest.then((tempUser) => {
allUsersTemp = allUsersTemp.concat(tempUser.Users);
paginationToken = tempUser.PaginationToken;
if(paginationToken) {
return getUserList();
} else {
return;
}
})
}

const adminUsers = CognitoIdentityServiceProvider.listUsersInGroupAsync(adminParams);

return Promise.all([adminUsers]).then(
([{ Users: adminUsers }]) => {
getUserList().then((item) => {
let allUsers = allUsersTemp;
const adminUsernames = adminUsers.map(user => user.Username);

allUsers.forEach(user => {
let mappedAttributes = {};
user.Attributes.forEach(attribute => mappedAttributes[attribute.Name] = attribute.Value);
user.Attributes = mappedAttributes;
user.isAdmin = adminUsernames.includes(user.Username);
});

dispatch({
type: FETCH_REGISTERED_USERS_SUCCESS,
payload: allUsers
});
});
}, ...



据我了解,bluebird Promise.all 调用会等待传递给它的每个项目都可以解析,然后再执行 .then 部分中的内容;在对代码进行任何更改之前,有两个列表,一个用于用户,一个用于管理员。 Promise.all 等待两个 promise 都完成,对数据进行一些基本处理,并在 action dispatch payload 中返回数据。

经过我的更改,处理和返回用户列表的逻辑在递归 promise 链 (getUserList) 完成后执行。

我的问题:这种技术可以吗?我可以按原样使用吗?还是它不安全,如果是,具体是什么问题?还有更好的方法吗?

我的弱点是递归和 promises/bluebird 所以请随时批评与这些主题相关的任何代码

最佳答案

我知道这已经有一段时间了,但这就是我在 Cognito 中扫描所有用户的方式。希望这会有所帮助

const getListUserCognito = async () => {
try {
const params = {
UserPoolId: userPoolID
};

console.log('params', JSON.stringify(params));

const listUserResp = await getAllUserCognito(params);

console.log('listUserResp', JSON.stringify(listUserResp));

return listUserResp.Users;
} catch (error) {
return null;
}
};

const getAllUserCognito = async (params) => {
try {
// string must not be empty
let paginationToken = 'notEmpty';
let itemsAll = {
Users: []
};
while (paginationToken) {
const data = await cognitoidentityserviceprovider
.listUsers(params)
.promise();

const { Users } = data;
itemsAll = {
...data,
...{ Users: [...itemsAll.Users, ...(Users ? [...Users] : [])] }
};
paginationToken = data.PaginationToken;
if (paginationToken) {
params.PaginationToken = paginationToken;
}
}
return itemsAll;
} catch (err) {
console.error(
'Unable to scan the cognito pool users. Error JSON:',
JSON.stringify(err, null, 2)
);
}
};

关于javascript - 在 JavaScript 中从 Amazon Cognito API 中详尽选择所有用户的安全且可扩展的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com