Подтвердить что ты не робот

Принудительная проверка электронной почты перед регистрацией входа в систему

Я использую

Accounts.config({
    sendVerificationEmail: true, 
    forbidClientAccountCreation: false
})

отправить подтверждение по электронной почте при создании пользователей. Однако, когда пользователи регистрируются, они разрешаются в продукт, прежде чем они подтвердят свою почту, чего я не хочу.

Я попытался взломать его, создав переменную шаблона, которая истинна, когда пользователь проверен, но информация пользователя поступает после визуализации шаблона и даже с помощью Meteor. setTimeout() Я не смог обновить шаблон при поступлении данных.

Любые предложения по правильному способу сделать это?

Тх

4b9b3361

Ответ 1

Во-первых, вам нужно сделать ваши данные "недоступными", взглянуть на функции публикации: http://docs.meteor.com/#meteor_publish

Итак, в вашей функции Meteor.publish для вашего продукта вы должны сделать что-то вроде:

Это гарантирует, что клиент может видеть продукт только в том случае, если он зарегистрирован и имеет подтвержденную учетную запись. Они все равно могут войти в систему, но не могут видеть продукты, пока их учетная запись не будет проверена.

Сервер 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({});
      }
   }
});

Имейте в виду, что вам нужно удалить autopublish, который использует метеорит, чтобы облегчить жизнь, он в основном публикует все коллекции до пользователя, но вы хотите ограничить определенную информацию, чтобы удалить ее.

Во-вторых, вам нужно обрабатывать данные на вашем шаблоне, чтобы, если пользователь не заходил в материал шаблона, не видно. Поэтому даже на том этапе, когда браузер загружается, они не будут видеть продукты

Клиент JS

Meteor.subscribe("productinfo");

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

Таким образом, помощник шаблона проверяет, зарегистрирован ли пользователь и у него есть подтвержденная учетная запись. Кроме того, если код был изменен на стороне клиента, они не будут видеть продукт из-за функции публикации.

Ответ 2

Чтобы остановить их вход в систему, вы можете сделать это:

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);
  }
});