2013-08-13 4 views
7

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

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

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

+0

Вам нужна система безопасности. Начните здесь: http://stackoverflow.com/q/10099843 –

+0

Это совершенно не связано. У меня есть рабочее приложение с 'account-password'. Я не хочу создавать целую систему безопасности, я просто хочу проверить уже зарегистрированного пользователя. –

ответ

17

Я могу помочь с первым вопросом. На момент написания, метеор не имеет метода 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; 
    } 
    } 
}); 

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

+0

Я хочу использовать это, но, поскольку он полагается на недокументированные внутренности, мне становится немного неловко. Вы используете это в производственном приложении? –

+1

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

+0

Я пытаюсь это сделать, и я получаю «TypeError: Не могу прочитать свойство« Клиент »неопределенного». Похоже, Meteor._srp не определился в последнем Meteor :( –

0

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

 

    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

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

Смежные вопросы