Подтвердите пароль пользователя в Meteor

Есть некоторые необратимые действия, которые пользователь может выполнить в моем приложении. Чтобы добавить уровень безопасности, я хотел бы убедиться, что человек, выполняющий такое действие, на самом деле является вошедшим в систему пользователем. Как я могу достичь этого?

  • Для пользователей с паролями я бы хотел, чтобы подсказка запрашивала повторный ввод пароля пользователя. Как я могу позже проверить этот пароль, не отправляя его по сети?

  • Возможно ли подобное действие для пользователей, авторизовавшихся через внешний сервис? Если да, то как этого добиться?


person Hubert OG    schedule 13.08.2013    source источник
comment
Вам нужна система безопасности. Начните здесь: stackoverflow.com/q/10099843   -  person Robert Harvey    schedule 13.08.2013
comment
Это совершенно не связано. У меня есть работающее приложение с установленным accounts-password. Я не хочу создавать целую систему безопасности, я просто хочу проверить уже вошедшего в систему пользователя.   -  person Hubert OG    schedule 13.08.2013


Ответы (2)


Могу помочь с первым вопросом. На момент написания этой статьи у метеора не было метода checkPassword, но вот как вы можете это сделать:

Я предполагаю, что на клиенте у вас есть форма с полем ввода под названием password и кнопкой под названием check-password. Код события может выглядеть примерно так:

Template.userAccount.events({
  'click #check-password': function() {
    var digest = Package.sha.SHA256($('#password').val());
    Meteor.call('checkPassword', digest, function(err, result) {
      if (result) {
        console.log('the passwords match!');
      }
    });
  }
});

Затем на сервере мы можем реализовать метод checkPassword следующим образом:

Meteor.methods({
  checkPassword: function(digest) {
    check(digest, String);

    if (this.userId) {
      var user = Meteor.user();
      var password = {digest: digest, algorithm: 'sha-256'};
      var result = Accounts._checkPassword(user, password);
      return result.error == null;
    } else {
      return false;
    }
  }
});

Дополнительные сведения см. в моем сообщении в блоге. Я сделаю все возможное, чтобы поддерживать его в актуальном состоянии.

person David Weldon    schedule 13.08.2013
comment
Я хочу использовать это, но, поскольку оно основано на недокументированных внутренних компонентах, это меня немного беспокоит. Вы используете это в рабочем приложении? - person Mike Turley; 27.08.2013
comment
Я использую его в качестве производственного приложения, и вы правы, беспокоясь об этом — я, конечно, беспокоюсь. - person David Weldon; 27.08.2013
comment
Я пробую это сейчас и получаю TypeError: Cannot read property 'Client' of undefined. Похоже, что Meteor._srp не определен в последнем Meteor :( - person Mike Turley; 27.08.2013
comment
Спасибо, что обновили этот ответ, @David. Я надеюсь, что в конце концов мы сможем найти способ сделать это, не зависящий от версии. - person Mike Turley; 11.03.2014
comment
@DavidWeldon не работает (версия 1.4). всегда получал неверный пароль, несмотря на правильный текущий пароль - person Abdul Hameed; 18.10.2016
comment
@AbdulHameed Я бы порекомендовал дважды проверить вашу реализацию - у меня это все еще работает в метеоре 1.4.2. - person David Weldon; 28.10.2016

Я не делал этого раньше, но я думаю, что вам понадобится что-то подобное на вашем сервере


    Accounts.registerLoginHandler(function(loginRequest) {
        console.log(loginRequest)
        var userId    = null;
        var username  = loginRequest.username;
        // I'M NOT SURE HOW METEOR PASSWORD IS HASHED...
        // SO YOU NEED TO DO A BIT MORE RESEARCH ON THAT SIDE
        // BUT LET'S SAY YOU HAVE IT NOW
        var password  = loginRequest.password;

        var user = Meteor.users.findOne({
            $and: [
                {username: username},
                {password: password} 
            ]
        });
        if(!user) {
            // ERROR
        } else {
            // VERIFIED
        }
    });

то вы можете вызвать эту функцию со стороны клиента следующим образом:


    // FETCH THE USERNAME AND PASSWORD SOMEHOW
    var loginRequest = {username: username, password: password};

    Accounts.callLoginMethod({
        methodArguments: [loginRequest]
    });

У меня есть проект на github для разных целей, но вы можете понять, как он структурирован: https://github.com/534N/apitest

Надеюсь это поможет,

person Sean Yang    schedule 13.08.2013