AWS:将用户授权给特定的客户端



所以我在AWS Cognito上有以下设置:

AWS Cognito用户池:UserPool_1

在这个用户池下,我定义了3个用户:Mike, Sarah, John

我在这个用户池下有3个应用程序客户端:

WebClient_1

WebClient_2

WebClient_3

I wantMikeWebClient_1,WebClient_2,和WebClient_3

I wantSarah只能访问:WebClient_3

约翰和只能访问WebClient_2

目前所有用户都可以访问这个用户池下定义的所有3个web应用程序,这不是我想要的。

如何限制用户池中的用户访问特定的应用程序客户端?

我们输入Sarah访问WebClient_1,我希望她收到一条消息:">用户未被授权">

我如何做到这一点?

我解决这个问题的方法是使用Cognito Pre Authentication Lambda。当用户请求身份验证时,Cognito触发器将运行自定义Lambda脚本。在Lambda脚本中,您将收到一个带有一些常用参数的事件。你可以取参数callerContext.clientIduserName做一些处理。对于少数用户,您可以在脚本中保留用户-客户端映射,但更有可能的是,您希望在DynamoDB等数据库中查找映射。

编辑:要接受认证,请执行callback(null, event);,拒绝认证,请执行callback("you are not coming in", null);

我可以通过使用多个片段来解决这个问题:

  • 用户迁移触发
  • 预认证触发

尝试仅使用预认证触发器会导致不完整且不安全的解决方案。触发器仅在用户尝试根据用户池进行身份验证时运行。这意味着,在用户通过了他们拥有权限的应用程序客户端的身份验证后,给定任何其他应用程序客户端的URL,用户将能够访问它。

作为解决方案,我决定采用不同的设置,其中每个应用程序客户端都有一个单独的用户池,一个通用池存储所有用户。当涉及到在每个用户池中创建相同的帐户时,这显然会变得很烦人,所以我通过使用迁移触发器减轻了这个问题。

例如,在Sarah第一次登录WebClient3时,迁移触发器运行并将她的数据导入到新的用户池中,同时保留她的密码。您可以将预认证触发器的功能组合到迁移触发器中,这样,如果用户不应该访问该应用程序客户端,那么迁移就会失败。

这里需要注意的是,如果用户是由管理员使用临时密码创建的,那么他们需要首先使用第一个池的客户端重置密码,然后才能进行迁移。此外,在迁移过程之后,用户的帐户现在独立于通用池,如果管理不当,可能会导致不一致。

最新更新