我们正在开发一个有两种用户的应用程序
- 个人用户(允许自己注册)。
- 代理机构的用户(仅由我们内部的管理员添加到应用程序中) 用户)。
该应用程序的设计方式是,所有 Cognito 操作(例如添加用户、删除用户、密码重置等)均由在 AWS 中运行的服务器 api(服务器端身份验证流程)完成 lambda 。我们不在客户端做任何事情。
我们的基础设施团队目前正在更改所有应用程序将在自己的 AWS 帐户下运行的方式,但我们不希望在每个帐户中创建用户池,因为我们的许多应用程序共享相同的用户池。因此,我们决定将池保留在当前帐户中,仅将应用程序移至各自的帐户。
我们确实知道如何从 NodeJS 的不同帐户连接到池,并假设我们创建了所有相应的角色和权限,我们甚至尝试使用池 ID 的完整 ARN,但 api 不允许 ARN,它需要仅池 id,如果我们仅使用池 id,则会抛出错误:
pool does not exists
我们认为这是因为它正在查看当前帐户而不是池所在的另一个帐户。
请指教
提前致谢
最佳答案
我假设您使用 NodeJS 内的 AWS 开发工具包来连接到 Cognito 用户池。
AWS SDK 将以某种方式获取凭证,以便对某个 AWS 帐户的 AWS 服务器进行身份验证。如果您未在代码中指定访问代码/ key (我希望不是这样!),SDK 可能会从环境中获取(临时) key 。
如果您在 Lambda 或 ECS 容器中运行 NodeJS,则可以设置 IAM 角色。如果您这样做,AWS 将创建一些临时凭证并通过环境变量注入(inject)它们。
要连接到不同的 AWS 账户,通常您有两种选择:
- 在其他 AWS 账户资源中使用资源策略来提供对正在运行的 AWS 账户的访问
- 手动向您的应用程序提供凭据,例如通过在 Lambda 中添加安全环境变量,可用于访问另一个 AWS 账户中的另一个 IAM 用户。
目前 Cognito 用户池无法使用选项 1(您可以检查 this table 以了解哪些服务支持此功能)。
选项 2 适用于您的场景,主要技巧是以安全的方式提供凭据。如何执行此操作取决于您的具体环境,但 Lambda 中的一种可能性是使用安全环境变量或 SSM 参数。
关于node.js - 使用 NodeJS(服务器端)从另一个帐户访问 AWS Cognito 池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162540/