Loopbackjs 使用Strongloop环回进行电子邮件验证-返回验证令牌

Loopbackjs 使用Strongloop环回进行电子邮件验证-返回验证令牌,loopbackjs,strongloop,Loopbackjs,Strongloop,我目前正在开发一个API。我正在使用Strongloop(环回) 我试图在用户注册时实现电子邮件验证。我有一个“用户”模型,它扩展了内置的“用户”模型 现在,当用户注册(POST/users)时,会发送一封电子邮件,其中包含指向/users/confirm的链接以及三个适当的参数,即uid、redirect和令牌。当用户单击链接时,后者的电子邮件地址被正确验证(emailVerification字段变为true) 但是,我注意到,当对/users发出POST请求时,响应包含验证令牌。这正常吗?验

我目前正在开发一个API。我正在使用Strongloop(环回)

我试图在用户注册时实现电子邮件验证。我有一个“用户”模型,它扩展了内置的“用户”模型

现在,当用户注册(POST/users)时,会发送一封电子邮件,其中包含指向/users/confirm的链接以及三个适当的参数,即uid、redirect和令牌。当用户单击链接时,后者的电子邮件地址被正确验证(emailVerification字段变为true)

但是,我注意到,当对/users发出POST请求时,响应包含验证令牌。这正常吗?验证令牌不是只能通过发送的电子邮件访问吗

因为事实上,通过向/用户发出POST请求并在响应中获取验证令牌,用户可以轻松地向用户发送另一个请求/使用适当的参数(包括验证令牌)进行确认,并验证电子邮件地址,即使该地址不存在


我是Strongloop的新手,也许我遗漏了什么。你们能帮忙吗?

我刚刚完成了这个例子。见:


@user2483431,验证电子邮件会在响应中公开电子邮件验证令牌以及用户id。正如您正确指出的,它可能会愚弄系统。一种解决方案是从响应中去除令牌值

在用户创建的afterRemote中,您可以使用

user.verify(options, function(err, response, next2) {
  if (err) {
    // error handling code
  }
  // stripping off verificationToken from response for security
  var replacementText = "check email"
  context.result.verificationToken = replacementText;
  next();
});

希望这有帮助

如果您想创建用户注册验证链接,但不使用内置的user moder,那么您需要创建验证令牌,然后发送链接。我添加了两种方法。您还需要使用远程方法,其中一个参数是对象类型:您需要使用register email发送参数。该方法如下这里我们使用user=any变量名,modelN=modelname

modelN.sendVerificationEmail = function (data, callback) {
  var user = loopback.models.modelN;

  if (!data.email) {
    return callback(commonUtils.buildError(
      'Recipient email is required.', 400, 'EMAIL_REQUIRED'
    ));
  }

  if (!emailValidator.validate(data.email)) {
    return callback(commonUtils.buildError(
      'Must provide a valid email.', 400, 'INVALID_EMAIL'
    ));
  }

  var findOneuserPromise
    = modelN.findOne({ 'where': { 'email': data.email }});

  findOneBusinessEmployeePromise.then(function (user) {
    if (!user) {
      return callback();
    }

    var sendVerificationEmailPromise
      = anothermodelname.sendVerificationEmail(user.id);

    sendVerificationEmailPromise.then(function () {
      callback();
    });

    sendVerificationEmailPromise.then(null, function (error) {
      callback(error);
    });
  });

  findOneuserPromise.then(null, function (error) {
    callback(error);
  });
};
我已经添加了另一个模型方法,然后添加这个

anothermodelname.sendVerificationEmail = function (userid) {
  var modelN = loopback.models.modelN;
  var Email = loopback.models.Email;
  var deferred = Q.defer();
  var findByIduserPromise = modelN.findById(userId);

  findByIduserPromise.then(function (user) {
    if (!user) {
      return deferred.reject(commonUtils.buildError(
        'Unknown "modelN" id "' + userId + '".',
        404, 'MODEL_NOT_FOUND'
      ));
    }
    if (!user.verificationToken) {
      return deferred.resolve(true);
    }


    modelN.generateVerificationToken(user,
      function (verificationTokenError, verificationToken) {
        if (verificationTokenError) {
          return deferred.reject(verificationTokenError);
        }

        user.verificationToken = verificationToken;

        var saveuserPromise = user.save();

        saveuserPromise.then(function (updateduser) {
          var link = emailConf.clientBaseUrl +
            emailConf.verifyEmailRedirect + '?uid=' +
            updateduser.id + '&token=' +
            updateduser.verificationToken;
               console.log("check+link:",link);
          /*eslint camelcase: [0, {properties: "never"}]*/
          emailOptions.to = updateduser.email;
          emailOptions.template = { 'name': 'verify' };
          emailOptions.global_merge_vars = [];

          emailOptions.global_merge_vars.push({
            'name': 'USER_NAME',
            'content': updateduser.name
            || updateduser.username || updateduser.email
          });

          emailOptions.global_merge_vars.push({
            'name': 'LINK',
            'content': link
          });
          Email.send(emailOptions, function () {});

          deferred.resolve(true);
        });

        saveuserPromise.then(null, function (error) {
          deferred.reject(error);
        });
      });
  });

  findByIduserPromise.then(null, function (error) {
    deferred.reject(error);
  });

  return deferred.promise;
};

我正在为这类问题构建一个回购示例,因为它经常出现。你可以看看我现在在做什么。它还没有完成,因为我目前正在做它,但我希望在周五完成。听起来很棒。期待它。示例完成后,请对答案进行投票。您是否建议我们在应用程序中创建一个新的用户模型?为什么不能使用用户模型而不是用户模型?是的,我们建议您扩展内置用户模型,以便于配置。请注意,在
common/models
中没有
User.json
User.js
,因此使用
User
扩展内置功能更容易,然后你可以修改
common/models/user.js
common/models/user.json
,就像修改任何其他脚手架模型一样。如果任何人有任何问题,请询问我