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

2024-03-02

我是一个小团队的一员,在一个相当小的网站上工作,该网站拥有用户帐户;此时大约有100名用户。我们正在使用 Amazon Cognito 进行用户管理。我们的网站上有一个摘要页面,其中显示所有用户和各种属性的列表/表格。然而,有一个硬性限制 https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.htmlAmazon Cognito listUsers API 调用返回的项目数,在本例中为 60。

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

此外,我们的网站使用react-redux 和 javascript 库 bluebird。在此问题的上下文中,请求所有用户列表的组件还会调度操作(redux 部分),并且来自 Amazon aws-sdk 的 CognitoIdentityServiceProvider 被传递到 bluebird Promise.promisfyAll (将异步后缀添加到 listUser 调用)。我正在修改此组件以获取完整的用户列表。

作为请求整个用户列表的草稿,我使用递归函数将 Promise 链接在一起,直到从 Amazon 返回的分页标记未定义并将结果存储在某些类变量中。我用过这个论坛帖子作为参考。 https://develop.zendesk.com/hc/en-us/community/posts/360004239687-Pagination-using-JavaScript-Promises

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

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

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 完成,对数据进行一些基本处理,并在操作调度有效负载中返回数据。

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

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

我的弱点是递归和承诺/蓝鸟,所以请随意批评与这些主题相关的任何代码


我知道已经有一段时间了,但这就是我用来扫描 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)
    );
  }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 从 Amazon Cognito API 中详尽选择所有用户的安全且可扩展的方法是什么? 的相关文章

随机推荐

  • 推力结构向量的迭代器

    我正在尝试以这种方式访问 向量元素 struct point unsigned int x unsigned int y thrust device vector
  • C# - 让所有派生类调用基类构造函数

    我有一个基类角色 它有几个派生自它的类 基类有各种字段和方法 我的所有派生类都使用相同的基类构造函数 但如果我不在派生类中重新定义构造函数 则会收到错误 错误 类 子类 不包含采用此数量参数的构造函数 我不想在每个派生类中重新定义构造函数
  • emacs 全局放大/缩小

    我知道我可以使用 C x C 放大 缩小 但这仅适用于当前文件 一旦我打开另一个 文本又回到默认值 一遍又一遍地这样做真的很烦人 如何保持当前 emacs 会话的全局缩放级别 我知道如果您知道确切的字体大小 则可以在初始化文件中设置它 但我
  • 使用 Instrumentation 记录未处理的异常

    我试图使用仪器来调试java应用程序 当前系统存在的问题是 几乎没有写任何日志语句 不良的异常处理 这使得追踪功能损坏的根本原因变得非常困难 为了处理这种情况我开发了工具 java代理使用InstrumentationAPI 我能够注入日志
  • 如何对面板进行双缓冲?

    我有一个带有轮盘赌轮的面板 我需要对面板进行双缓冲 以使其停止闪烁 谁能帮我吗 EDIT 是的 我已经尝试过了 panel1 doublebuffered不存在 只有this doublebuffered 我不需要缓冲表单 只需缓冲面板 另
  • C# 如何将 Resharper 错误视为 msvs 2010 中的编译错误?

    我想将 resharper 5 0 错误 可能的空引用异常 视为 MSVC 2010 编译错误 是否可以 Update 因为人们似乎仍在寻找这个答案 这 或者非常类似的事情 今天是可能的 例如StyleCop 分析仪 https githu
  • 以 O(深度) 填充树的函数

    纯函数式数据结构 http books google com books about Purely Functional Data Structures html id SxPzSTcTalAC有以下练习 2 5 Sharing can b
  • Angular2动态改变CSS属性

    我们正在制作一个Angular2应用程序我们希望能够以某种方式创建一个全局 CSS 变量 并在分配变量时更新属性值 我们已经使用 Polymer 一段时间了 现在我们正在切换到 Angular2 组件 并且我们使用了 CSS 属性 Poly
  • 等待异步脚本结果超时 Selenium C# Protractor

    我正在尝试使用 Protractor net 为 AngularJS 平台创建一个自动化测试脚本 并在 C 中使用 Selenium 我使用下面的代码创建了驱动程序 driver new FirefoxDriver Ngdriver new
  • Windows 无法绑定到 49690 以上的端口

    我运行一个绑定到端口 50005 的应用程序已经有一段时间了 似乎最近发生了一些变化 我的机器上没有应用程序能够绑定到 127 0 0 1 上 49690 以上的任何 TCP 端口 有谁知道什么时候 发生了什么变化 操作系统名称 Micro
  • Resharper - 说服管理层[重复]

    这个问题在这里已经有答案了 可能的重复 Reshaper 的业务案例 https stackoverflow com questions 2298308 business case for resharper 我刚刚毕业 正在为我的第一家公
  • 如何知道 MPMoviePlayerController 正在 Iphone OS 3.0 中播放

    我需要知道 MPMoviePlayerController 是否在特定时刻正在播放 在 iphone 3 0 中 它不会触发 MPMoviePlayerContentPreloadDidFinishNotification 有谁知道有什么解
  • IIS 自动启动未禁用空闲超时

    我在 Windows Azure Web 角色上设置 ASP NET 自动启动 我在 Windows Server 2012 上使用 ASP NET 4 5 和 IIS 8 我基本上是跟着那些指示 http www iis net lear
  • C++ 模板 template (双模板?)

    我想建立一个Stack类 因此用户将能够选择他想要使用哪个容器来实现Stack 例如 List Vector 部分代码 stack h ifndef STACK H define STACK H template
  • 设置H2密码

    在嵌入式模式下工作时如何设置自己的密码来访问 h2 如果有人感到困惑 谈论访问数据库的 root 密码 在 Eclipse 中 密码分配似乎是在创建数据库连接时发生的 这反过来又启动了模式创建过程 我们在其中提供用户名和密码 即使这是真的
  • 如何在更改密码时触发 Firebase 中的云功能?

    当用户更改密码时 我试图触发 Firebase 云功能 无论是 更改密码 firebase auth currentUser 更新密码 新密码 或通过重置它 firebase auth 发送密码重置电子邮件 电子邮件 由于我没有在任何地方存
  • 现代 C++ 中比较 double/float 是否相等的现代实践 [重复]

    这个问题在这里已经有答案了 if std abs double1 double2 lt std numeric limits
  • Powershell 编码默认输出

    我在 TFS 构建中运行的 powershell 脚本遇到以下问题 这两个问题都与 TFS 无关 可以使用简单的 powershell 命令行窗口重现 1 与TFS完全无关 看来 Powershell 在管道方面不喜欢德语元音变音 1a 这
  • 来自 XElement 的内部文本? [复制]

    这个问题在这里已经有答案了 我很难从 XElement 的内部文本中获取正确的值 首先 这是我正在使用的 XML 这是我们工作流程中某个流程产生的生产数据的副本 换句话说 我无法更改 XML 只能解析它 我想要获取其内部文本的元素内部包含看
  • 使用 JavaScript 从 Amazon Cognito API 中详尽选择所有用户的安全且可扩展的方法是什么?

    我是一个小团队的一员 在一个相当小的网站上工作 该网站拥有用户帐户 此时大约有100名用户 我们正在使用 Amazon Cognito 进行用户管理 我们的网站上有一个摘要页面 其中显示所有用户和各种属性的列表 表格 然而 有一个硬性限制