проблема с пониманием функциональности локальной стратегии паспорта nodejs - PullRequest
1 голос
/ 21 марта 2019

Я новичок в узле. Недавно я решил создать систему блогов, в которой есть система авторизации, которая создается с помощью модуля паспорта и локальной стратегии. Я использовал паспортную документацию и некоторые видеоуроки для ее разработки, но я не понимаю, как это работает, я не понимаю логику. У меня есть форма входа в систему, которая имеет два поля (имя пользователя, пароль) и кнопку отправки. Вы можете увидеть мой код login.jade здесь. он написан на языке шаблонов нефрита и использует семантический пользовательский интерфейс (что-то вроде начальной загрузки).

  form.ui.form(method="POST",action="")
                div.field 
                    label Username
                    div.ui.left.icon.input
                        i.user.icon
                        input(type="text",name="username",placeholder="username")
                div.field
                    label Password
                    div.ui.left.icon.input 
                        i.lock.icon
                        input(type="password",name="password",placeholder="password")
                button.ui.primary.button(type="submit") log-in

и вот мой паспорт местной стратегии

passport.use(new localStrategy(function(username,password,done){
User.checkUserName(username,function(err,user){
if (err) throw err;
if (!user) {
  console.log('unknown user');
  return done(null,false,{message:'user not found'});
}
if(user.password!=password){
  return done(null,false , {message : 'password is wrong'});
}
return done (null,user);
});
}));

checkUserName - это функция в моих моделях (user.js), которая находит имя пользователя в базе данных.

module.exports.checkUserName= function(username,callback){
User.findOne({username:username},callback);
}

Теперь я не понимаю, как работает локальная стратегия. как он понимает, какое поле в моей форме входа в систему для имени пользователя и какое поле для пароля? он принимает только два аргумента (имя пользователя, пароль), но я не знаю, как он определяет, откуда берутся эти аргументы и как он понимает, что это должны быть мои учетные данные формы входа. Я был бы очень благодарен, если бы кто-нибудь объяснил мне, что здесь происходит.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Если вы используете аутентификацию по имени / паролю, по умолчанию localStrategy () использует поля ввода с name="username" и name="password". Итак, ваша форма верна.

Если вы хотите использовать другие имена полей, вы можете изменить значения по умолчанию. Прочитай это. http://www.passportjs.org/docs/username-password/#parameters

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

Это - хорошо разработанная надежная схема хеширования. Есть и другие.

0 голосов
/ 21 марта 2019

Рассматривая реализацию стратегии в github, он просматривает как запрос, так и его тело и по умолчанию ищет ключи username и password для соответствующих значений.

Это соответствует значениям имени в форме входа.

Если вы хотите использовать разные значения имени для своих входов, вы можете указать, какие значения вы хотите использовать, предоставив значение usernameField или passwordField, как показано ниже

passport.use(new localStrategy(function(username,password,done){
User.checkUserName(username,function(err,user){
  if (err) throw err;
  if (!user) {
    console.log('unknown user');
    return done(null,false,{message:'user not found'});
  }
  if(user.password!=password){
    return done(null,false , {message : 'password is wrong'});
  }
  return done (null,user);
  });
},
{
  usernameField: 'user',
  passwordField: 'pass'
}
));

Затем вы можете обновить значения имени формы входа в систему, чтобы они соответствовали

  form.ui.form(method="POST",action="")
                div.field 
                    label Username
                    div.ui.left.icon.input
                        i.user.icon
                        input(type="text",name="user",placeholder="username")
                div.field
                    label Password
                    div.ui.left.icon.input 
                        i.lock.icon
                        input(type="password",name="pass",placeholder="password")
                button.ui.primary.button(type="submit") log-in
...