2015-10-20 3 views
1

Я делаю регистрацию формы с помощью passportJs и всегда возвращает failRedirect. У меня есть поиск в переполнении стека для этой проблемы, но у меня нет правильного ответа. Вот мой код:Nodejs - аутентификация паспорта всегда возвращает отказ перенаправления

  • Форма изготовления формы нефрита:

    form(method='post', action='/users/login', enctype='multipart/form-data') 
    .form-group 
        label Username 
        input.form-control(name='username', type='text'  placeholder='Enter Username') 
    .form-group 
        label Password 
        input.form-control(name='password', type='password' placeholder='Enter password') 
    input.btn.btn-default(name='submit', type='submit', value='Login') 
    

маршрутизатор Hanlde использует экспресс рамки формы Nodejs и паспортный промежуточное программное обеспечение:

passport.serializeUser(function(user, done) { 
done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
User.getUserById(id, function(err, user) { 
    done(err, user); 
}); 
}); 

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
}, 
function(username, password, done) { 
    User.getUserByUsername(username, function(err, user) { 
     if (err) throw err; 
     if (!user) { 
      console.log('Unknown User'); 
      return done(null, false, { 
       message: 'Unknown User' 
      }); 
     } 

     User.comparePassword(password, user.password, function(err, isMatch) { 
      if (err) throw err; 
      if (isMatch) { 
       return done(null, user); 
      } else { 
       console.log('Invalid Password'); 
       return done(null, false, { 
        message: 'Invalid Password' 
       }); 
      } 
     }); 
     }); 
    } 
)); 

    router.post('/login', passport.authenticate('local', { 
    failureRedirect: '/users/login', 
    failureFlash: 'Invalid username or password' 
}), function(req, res) { 
console.log('Authentication Successful'); 
req.flash('success', 'You are logged in '); 
res.redirect('/'); 
}); 
+0

Вы можете разделить коды для '' функций comparePassword' getUserByUsername' и? – Raeesaa

+0

@ user2235057 Да: я пишу его в папку модели, файл user.js: module.exports.getUserByUsername = функция (имя пользователя, обратный вызов) { \t вар запрос = {имя пользователя: имя пользователя}; \t User.findOne (запрос, обратный вызов); } module.exports.getUserByUsername = function (имя пользователя, обратный вызов) { \t var query = {имя пользователя: имя_пользователя}; \t User.findOne (запрос, обратный вызов); } –

+1

Это полный код для функции 'getUserByUsername'? Если это так, в этой функции есть проблема. Коды должны были быть примерно такими: module.exports.getUserByUsername = function (имя пользователя, callback) {var query = {имя пользователя: имя_пользователя}; User.findOne (запрос, функция (err, user) {callback (err, user)}); }, и вы не использовали функцию comparePassword, поэтому я не уверен, что это правильно. – Raeesaa

ответ

2

Глядя на getUserByUsername функции вы делитесь комментариями, похоже, что вы не вызываете функцию обратного вызова getUserByUsername, и поэтому он не получает user объект, приводящий к перенаправлению отказа. Функция, которую разделяет был:

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

Изменение его следующее должно устранить проблему:

module.exports.getUserByUsername = function(username, callback){ 
    var query = {username: username}; 
    User.findOne(query, function(err, user) { 
    callback(err, user); 
    }); 
} 
Смежные вопросы