Cognito 无法注册状态尚未确认的用户

Nes*_*bon 5 amazon-cognito

Cognito 用户池配置为供用户使用其“电子邮件地址”进行注册和登录。

如果用户使用其他人的电子邮件注册,那么该电子邮件将陷入“未确认”状态,并且所有者将无法正确使用它。

话虽如此,让我提供一个以下场景的示例:

  1. 用户使用不属于该用户的电子邮件地址登录,假设它是someone@mail.com。在此步骤(注册表单)中,会发送更多数据,例如组织名称和用户全名。
  2. 验证码已发送至邮箱
  3. 现在拥有someone@email.com的用户想要创建一个帐户(也许在未来几天),所以他去填写了注册表,但cognito抛出了一个错误{"__type":"UsernameExistsException","message":"An account with the given email already exists."}

考虑考虑: * 如果电子邮件已存在但处于未确认状态,则为用户提供重新发送链接的选项。此选项不是最佳选择,因为如第一步所示,用户配置文件中可能已经存在其他数据。* 可以使用自定义 lambda 在注册前删除未确认的用户或作为每天的维护过程,但我不确定这是否是最好的方法。

cognito consol 中的策略下还有此配置:“管理员创建的用户帐户如果不使用应多快过期?”,但顾名思义,此设置仅适用于受到管理员邀请的用户。

对于这种困境,有没有合适的解决办法呢?

小智 2

Amazon Cognito 为这些功能和自动注册提供了预注册触发器。您的想法与我根据 Cognito 文档实现的方式相同。

在这里,我使用 amplify/cli 这是用于我的开发目的的工具链,因此触发器中使用的 lambda 函数如下:

`

"use strict";
console.log("Loading function");
var AWS = require("aws-sdk"),
  uuid = require("uuid");
var cognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider();
exports.handler = (event, context, callback) => {
  const modifiedEvent = event;
  // check that we're acting on the right trigger
  if (event.triggerSource === "PreSignUp_SignUp") {
    var params = {
      UserPoolId: event.userPoolId,
      Username: event.userName
    };
    cognitoIdentityServiceProvider.adminGetUser(params, function(err, data) {
      if (err) {
        console.log(err, err.stack);
      } // an error occurred
      else {
        console.log("cognito service", data);
        if (data.UserStatus == "UNCONFIRMED") {
          cognitoIdentityServiceProvider.adminDeleteUser(params, function(
            err,
            data
          ) {
            if (err) console.log(err, err.stack);
            // an error occurred
            else console.log("Unconfirmed user delete successful ");
           // successful response
          });
        }
        // successful response
      }
    });
    return;
  }
  // Throw an error if invoked from the wrong trigger
  callback('Misconfigured Cognito Trigger '+ event.triggerSource);
};
Run Code Online (Sandbox Code Playgroud)

`

这实际上将使用 aws-sdk 方法 adminGetUser 和 adminDeleteUser 检查并删除状态是否为 UNCONFIRMED

希望这会有所帮助;)