所以我在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.clientId
和userName
做一些处理。对于少数用户,您可以在脚本中保留用户-客户端映射,但更有可能的是,您希望在DynamoDB等数据库中查找映射。
编辑:要接受认证,请执行callback(null, event);
,拒绝认证,请执行callback("you are not coming in", null);
我可以通过使用多个片段来解决这个问题:
- 用户迁移触发
- 预认证触发
尝试仅使用预认证触发器会导致不完整且不安全的解决方案。触发器仅在用户尝试根据用户池进行身份验证时运行。这意味着,在用户通过了他们拥有权限的应用程序客户端的身份验证后,给定任何其他应用程序客户端的URL,用户将能够访问它。
作为解决方案,我决定采用不同的设置,其中每个应用程序客户端都有一个单独的用户池,一个通用池存储所有用户。当涉及到在每个用户池中创建相同的帐户时,这显然会变得很烦人,所以我通过使用迁移触发器减轻了这个问题。
例如,在Sarah第一次登录WebClient3时,迁移触发器运行并将她的数据导入到新的用户池中,同时保留她的密码。您可以将预认证触发器的功能组合到迁移触发器中,这样,如果用户不应该访问该应用程序客户端,那么迁移就会失败。
这里需要注意的是,如果用户是由管理员使用临时密码创建的,那么他们需要首先使用第一个池的客户端重置密码,然后才能进行迁移。此外,在迁移过程之后,用户的帐户现在独立于通用池,如果管理不当,可能会导致不一致。