2016-04-19 86 views
0

私のアプリケーションのnode.jsバックエンドのユーザーを認証するためにpassport.jsを使用しています。次のコードは常にfailureRedirectを実行しており、その理由を見つけることができません。エラーメッセージはありません。Passport認証は常にfailureRedirectを実行しています

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

私はパスポートのウェブサイトから、このコードをコピーして、これはあまりにも機能していません。次のコードでも開始されていない

router.post('/login', passport.authenticate('local', { successRedirect: '/', 
               failureRedirect: '/users/login' })); 

:関連するコードの

passport.use(new localStrategy({ 
          email: 'email', 
          password: 'password' 
          }, function(email, password, done) { 
User.getUserByEmail(email, 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' 
      }); 
     } 
    }); 
}); 
})); 

レスト:

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

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


module.exports.getUserByEmail = function(email, callback){ 
var query = {email: email}; 
    User.findOne(query, function(err, user) { 
    callback(err, user); 
    }); 
} 

module.exports.getUserById = function(id, callback){ 
    User.findById(id, function(err, user) { 
    callback(err, user); 
    }); 
} 

module.exports.comparePassword = function(userPassword, hash, callback){ 
    console.log("pwd: " + userPassword + " hash: " + hash); 
    bcrypt.compare(userPassword, hash, function(err, isMatch) { 
    if(err) return callback(err); 
    callback(null, isMatch); 
    }); 
} 

答えて

1

localstrategyの設定を変更してみてくださいthis one

明示的に使用するデフォルトのログイン変数名は「username」と「password」です。場合は、それらを変更する必要があり、それは上記の場合の「メール」であるとして、コードは次のように変更する必要があります。usernameFieldの変更がなければ

passport.use(new localStrategy({usernameField: 'email'}, function(username, password, done){ 
    User.getUserByEmail(username, function(err, user){ 
    //rest of the code 

、localStrategyは、「ユーザ名」を検索しますそれはそれを見つけることができませんので、リダイレクトします。これで、usernameFieldが変更されると、 'email'が検索され、これをusernameの代わりに使用して認証を行います。

+0

これは動作していません...エラーPSに変更はありません。あなたの答えに余分な ';'があります – suku

+0

私の悪い、私は答えを編集します –

+0

これは速達で行うこのような愚かなこと – suku

関連する問題