如何禁用通过身份提供商创建的AWS Cognito用户池帐户?

时间:2020-07-28 08:56:41

标签: amazon-cognito amazon-cognito-facebook amazon-cognito-triggers

那里有Cognito用户池专家吗?我已经使用Cognito已有一段时间了,但是这个让我有些困惑。

  • 我们允许用户使用诸​​如Facebook之类的社交帐户进行注册和登录,这些社交帐户在用户池中设置为身份提供者。

  • 用户需要先填写自定义注册表格,然后才能使用主应用程序-我们不使用托管的UI进行登录或注册

  • 自定义注册过程的一个步骤使用户可以指示要使用的社交服务提供商

  • 这使我们能够从社交服务提供商处撤回用户的电子邮件,姓氏和名字,这非常好-我们目前使用认知客户端和回调来实现

  • 但是,这样做是为了在注册过程完成之前在Userpool中预配一个用户-实际上这很有意义-为了Cognito向我们提供需要调用到社交服务提供商中的用户信息/ userinfo端点以填充用户数据

  • 因此,我们现在遇到的问题是,尽管用户在注册过程中途进行了一半,但我拥有一个已确认的用户帐户-例如。在用户完成注册过程之前

  • 这是一个问题,因为用户可以使用其社交登录名登录应用程序而无需完成注册过程

所以我看到有两个选择:

  • PostConfirmation Lambda触发器,该触发器使用cognito-idp SDK在确认用户后立即将其禁用
  • 不要使用Cognito来获取用户信息,例如名字,姓氏,电子邮件,图片等-但这将要求我们为当前和将来的每一个社交提供者编写解决方案,而这并不是我所渴望的< / li>

我缺少明显的东西吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我会说PostConfirmation Lambda触发器是一种好方法-但是请使用 adminDisableProviderForUser 来禁止用户使用指定的外部(SAML或社交)身份提供者登录

adminDisableProviderForUser

您以后可以调用 adminLinkProviderForUser 将用户池中的现有用户帐户链接到外部身份提供商。

adminLinkProviderForUser

另一种解决方案是,如果用户尚未完全完成注册过程,则可以通过预身份验证Lambda触发器检查有关已完成注册过程的唯一标识符来阻止用户登录

答案 1 :(得分:0)

最终,对我们而言最简单的解决方案是Cognito中的预令牌生成触发器,如下所示:

exports.handler = async (event) => {

  if(event.triggerSource==="TokenGeneration_HostedAuth") {

     //check db/api etc to see if we have a valid registration stored for user
     if(!hasCompletedRegistration) {

       //throw auth exception which we can catch on the frontend to inform user
       throw new Error("REGISTRATION_NOT_COMPLETE")
     }
  }

  return event

};

对于用户名/密码登录,TriggerSource将为 TokenGeneration_Authentication

对于联盟/社交登录,TriggerSource将为 TokenGeneration_HostedAuth