1

那里有任何 Cognito 用户池专家吗?我已经使用 Cognito 有一段时间了,但是这个让我有点难过。

  • 我们允许用户使用 Facebook 等社交账户注册和登录,这些账户在用户池中设置为身份提供者。

  • 用户需要先完成自定义注册表单才能使用主应用程序 - 我们不使用托管 UI 进行登录或注册

  • 自定义注册过程的一个步骤允许用户指示随后要使用的社交提供者

  • 这使我们能够从社交服务提供商那里撤回用户的电子邮件、名字和姓氏,这很棒 - 我们目前使用 cognito 客户端和回调来执行此操作

  • 但是这样做,这会在注册过程完成之前在 Userpool 中提供一个用户 - 事实上这是有道理的 - 为了让 Cognito 向我们提供它需要调用到社交提供者 /userinfo 端点以填充用户数据

  • 所以,我们现在遇到的问题是,当用户完成注册过程的一半时,我有一个确认的用户帐户 - 例如。在用户完成注册过程之前

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

所以在我看来,我有两个选择:

  • PostConfirmation Lambda 触发器,它使用 cognito-idp SDK 在用户确认后立即禁用用户
  • 不要使用 Cognito 来获取用户信息,例如名字、姓氏、电子邮件、图片等 - 但是这需要我们为每个当前和未来的社交提供商编写一个解决方案,这不是我热衷的事情

我错过了一些明显的东西吗?

提前致谢!

4

2 回答 2

1

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

adminDisableProviderForUser

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

adminLinkProviderForUser

另一种解决方案是防止用户在尚未完全完成注册过程的情况下通过预身份验证 Lambda 触发器检查与您已完成的注册过程相关的唯一标识符来登录

于 2020-10-16T10:17:00.440 回答
0

最终对我们来说最简单的解决方案是Cognito中的Pre Token Generation Trigger ,如下所示:

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

于 2020-11-21T11:46:04.193 回答