Login 在登录meteor之前强制进行电子邮件验证

Login 在登录meteor之前强制进行电子邮件验证,login,meteor,Login,Meteor,我用 创建用户时发送电子邮件验证。然而,当用户注册时,他们在验证邮件之前就被允许进入产品,这是我不想要的 我试图通过创建一个模板变量来破解它,该模板变量在用户被验证时为true,但用户信息在模板呈现之后到达,甚至是使用流星。setTimeout()数据到达时,我无法更新模板 对正确的方法有什么建议吗 Tx首先,您需要将数据设置为“不可压缩”,查看发布功能: 因此,在产品的Meteor.publish功能中,您应该执行以下操作: 这确保客户端只有在登录并拥有已验证的帐户时才能看到产品。他们仍然可以

我用

创建用户时发送电子邮件验证。然而,当用户注册时,他们在验证邮件之前就被允许进入产品,这是我不想要的

我试图通过创建一个模板变量来破解它,该模板变量在用户被验证时为true,但用户信息在模板呈现之后到达,甚至是使用流星。setTimeout()数据到达时,我无法更新模板

对正确的方法有什么建议吗


Tx

首先,您需要将数据设置为“不可压缩”,查看发布功能:

因此,在产品的Meteor.publish功能中,您应该执行以下操作:

这确保客户端只有在登录并拥有已验证的帐户时才能看到产品。他们仍然可以登录,但在验证其帐户之前无法查看产品

服务器js

Accounts.config({
    sendVerificationEmail: true, 
    forbidClientAccountCreation: false
})
请记住,您需要删除meteor用来简化生活的
autopublish
,它基本上会将所有收藏发布给用户,但您希望限制某些信息,因此您应该删除它

其次,您需要处理模板上的数据,这样,如果用户未登录模板,则模板上的内容将不可见。因此,即使在浏览器最初加载的步骤中,他们也不会看到产品

客户端JS

Meteor.publish("productinfo", function () {
  user = Meteor.users.findOne({_id:this.userId})
  if(user) {
      if(user.emails[0].verified) {
          //You can put some extra logic in here to check which product the user has, if you're selling or something like that
          return Products.find({});
      }
   }
});

这样,模板助手将检查用户是否已登录&他们是否拥有已验证的帐户。此外,如果在客户端更改了代码,由于发布功能,他们将看不到产品。

要阻止他们登录,您可以执行以下操作:

Meteor.subscribe("productinfo");

Template.products.products = function() {
  if(Meteor.userId()) {
    if(Meteor.user().emails[0].verified) {
        return Product.findOne({_id:"your product id"});
    }
  }
}

虽然这是一个老问题,但我刚刚成功地实现了@cobberboy的解决方案。
Meteor.startup(function() {
  if (Meteor.isServer) {
    var loginAttemptVerifier = function(parameters) {
      if (parameters.user && parameters.user.emails && (parameters.user.emails.length > 0)) {
        // return true if verified email, false otherwise.
        var found = _.find(
                           parameters.user.emails, 
                           function(thisEmail) { return thisEmail.verified }
                          );

        if (!found) {
          throw new Meteor.Error(500, 'We sent you an email.');
        }
        return found && parameters.allowed;
      } else {
        console.log("user has no registered emails.");
        return false;
      }
    }
    Accounts.validateLoginAttempt(loginAttemptVerifier);
  }
});