使用NodeJS(服务器端)从另一个帐户访问AWS Cognito池

时间:2019-01-12 18:17:15

标签: node.js amazon-web-services amazon-cognito

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

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

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

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

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

  

池不存在

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

请告知

预先感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

要连接到其他AWS账户,通常有两个选择:

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

当前对于Cognito用户池而言,选项1不可用(您可以检查this table来查看哪些服务支持此功能。)

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