验证码而不是环回中的url

Verification code rather than url in loopback

我正在使用 Loopback 作为 api 用于 phone 应用程序。

如何在用户注册时更改电子邮件地址的开箱即用验证。我需要它是一个 4 位代码(而不是 url),这样它对用户在应用程序中验证他们的帐户更加友好。

即。然后他们只需要输入 4 位数字来确认注册

有几种方法可以做到这一点,但基本上归结为重写 the user.verify() 方法(或其中的一部分)。如果您单击上面的 link 并向下滚动一点,您将看到 LoopBack 如何使用 crypto.randomBytes() 方法生成存储在用户对象上的 verificationToken,然后它通过电子邮件将其发送给用户。我们可以在扩展 user 的 "submodel" 中覆盖此方法,然后自己实现它,但请注意,您将复制大量信息。

就是说,我已经 submitted a PR 使用 LoopBack 来简化这件事。查看 link,您可以了解将来 可能 是如何完成的(如果 PR 没有更改)。

现在,您必须覆盖 verify() 方法:

User.prototype.verify = function(options, fn) {
  var user = this;

  // do a lot of audits and other stuff (check the current source)...

  // Set the token any way you like...
  user.verificationToken = "123456"; // <-- this probably isn't a good way
  user.save(function(err) {
    if (err) {
      fn(err);
    } else {
      sendEmail(user);
    }
  });

  function sendEmail(user) {
    // you should be able to keep this exactly as it is in the source...
  }
};

当然,不要忘记阅读 LoopBack 文档中的 verifying user email addresses

另一种选择是pass the token generation function to the options object. You can see how it's used if you scroll down a bit

有关如何覆盖用户模型并将选项对象传递给 verify() 方法的步骤。

您可以在创建新用户后在远程挂钩中执行此操作,例如:

User.afterRemote('create', function(context, user, next) {
    var userModel = User.constructor;

    myTokenGenerator = function(user, cb) {
      myToken = '1234'
      cb(null, myToken);
    };

    var options = {
      type: 'email',
      mailer: Email,
      to: user.email,
      from: senderEmail,
      subject: 'My subject',
      template: path.resolve(__dirname, '../views/verify.ejs'),
      user: user,
      host: myEmailHost,
      port: myEmailPort,
      generateVerificationToken: myTokenGenerator
    };

    user.verify(options, function(err, response) {

      if (err) {
        next(err);
        return;
      }
      console.log("Account verification email sent to " + options.to);
      next();
      return;
    });
});