首页 > 解决方案 > 使用 NodeJS(服务器端)从另一个账户访问 AWS Cognito 池

问题描述

我们正在开发一个有两种用户的应用程序

  1. 个人用户(允许自己注册)。
  2. 代理商的用户部分(仅由我们的内部用户管理员添加到应用程序)。

该应用程序的设计方式是所有 Cognito 操作(如添加用户、删除用户、密码重置等)都由运行在AWS Lambda中的服务器 api(服务器端身份验证流程)完成。我们在客户端不做任何事情。

我们的基础设施团队目前正在更改所有应用程序在其自己的 AWS 账户下运行的方式,但我们不想在每个账户中创建用户池,因为我们的许多应用程序共享同一个用户池。因此,我们决定将池保留在当前帐户中,并且仅将应用程序移动到各自的帐户中。

我们确实知道如何从 NodeJS 的不同帐户连接到池,并假设我们创建了所有各自的角色和权限,我们甚至尝试使用池 id 的完整 ARN,但 api 不允许 ARN,它只需要池id 如果我们只使用池 id,它会抛出一个错误说

池不存在

我们认为这是因为它正在查看当前帐户而不是池所在的另一个帐户。

请指教

提前致谢

标签: node.jsamazon-web-servicesamazon-cognito

解决方案


我假设您使用 NodeJS 中的 AWS 开发工具包连接到 Cognito 用户池。

AWS 开发工具包会以某种方式获取凭证以向特定 AWS 账户的 AWS 服务器进行身份验证。如果您未在代码中指定访问代码/密钥(我希望不是这种情况!),SDK 可能会从环境中获取(临时)密钥。

如果您在 Lambda 或 ECS 容器中运行 NodeJS,则可以设置 IAM 角色。如果您这样做,AWS 将创建一些临时凭证并通过环境变量注入它们。

要连接到不同的 AWS 账户,通常有两种选择:

  1. 使用其他 AWS 账户资源中的资源策略来提供对正在运行的 AWS 账户的访问权限
  2. 手动向您的应用程序提供凭证,例如通过在 Lambda 中添加安全环境变量,可用于访问另一个 AWS 账户中的另一个 IAM 用户。

Cognito 用户池目前无法使用选项 1(您可以查看此表以查看哪些服务支持此选项)。

对于您的方案,选项 2 是可能的,主要技巧是以安全的方式提供凭据。如何执行此操作取决于您的特定环境,但 Lambda 中的一个可能性是使用安全环境变量或 SSM 参数。


推荐阅读