2015-02-23 28 views
0

所以我想添加本地身份驗證到我的MEAN堆棧應用程序。 一切都運轉平穩。註冊很好。但我無法以用戶身份登錄。MEAN堆棧身份驗證與護照:登錄不工作(但我可以創建新用戶)

我越來越: POST /登錄302 3.979毫秒 - 58 控制檯(通過摩根) 上,但肯定是有錯誤(快遞路線的「failureRedirect」通過護照設置)

莫非從數據庫讀取問題?爲什麼我能寫它,然後...

與薛寶釵的測試表明,該方案不能從DB通過用戶模式「找到電子郵件用戶」

任何人有任何線索,爲什麼發生這種情況?

這是我的護照戰略代碼:

/config/passport.js 
var LocalStrategy = require('passport-local').Strategy; 

var User   = require('../models/users'); 


module.exports = function(passport) { 


// passport session setup ================================================== 

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


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


// local login ============================================================= 




passport.use('local-login', new LocalStrategy({ 

    usernameField : 'email', 
    passwordField : 'password', 
    passReqToCallback : true 
}, 
function(req, email, password, done) { 

    User.findOne({ 'local.email' : email }, function(err, user) { 

     if (err) 
      return done(err); 

     if (!user) 
      return done(null, false, req.flash('loginMessage', 'No user found.')); 


     if (!user.validPassword(password)) 
      return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 

     return done(null, user); 
    }); 

})); 




// local sign up ============================================================= 


passport.use('local-signup', new LocalStrategy({ 

    usernameField : 'email', 
    passwordField : 'password', 
    passReqToCallback : true 
}, 
function(req, email, password, done) { 

    User.findOne({ 'local.email' : email }, function(err, user) { 

     if (err) 
      return done(err); 


     if (user) { 
      return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
     } else { 


      var newUser   = new User(); 


      newUser.local.email = email; 
      newUser.local.password = newUser.generateHash(password); // use the generateHash function in our user model 

      newUser.save(function(err) { 
       if (err) 
        throw err; 
       return done(null, newUser); 
      }); 
     } 

    }); 

})); 

}; 

這裏的路線:

// /login ====================================================================== 

app.route('/login') 
.get(function(req, res) { 
    res.setHeader('Content-Type', 'text/html'); 
    res.render('login.html'); 
}) 
.post(passport.authenticate('local-login', { 
     successRedirect : '/profile', 
     failureRedirect : '/' 

    })); 


// /signup ====================================================================== 

app.route('/signup') 
.get(function(req, res) { 
    res.setHeader('Content-Type', 'text/html'); 
    res.render('signup.html'); 
}) 
.post(passport.authenticate('local-signup', { 
     successRedirect : '/profile', 
     failureRedirect : '/' 
     })); 
+0

顯示您的登錄表單,它是否包含電子郵件和密碼? – 2015-02-23 07:25:10

+0

我建議一些控制檯日誌記錄,以確切地看到傳遞給查找調用的內容。另外,你比較「像喜歡」嗎?區分大小寫可能是一個問題,例如:您是否在以小寫字母搜索電子郵件地址(類似地以小寫字母存儲)? – Ben 2015-02-23 13:41:28

+0

想通了......我的表格沒有名字attrs – 2015-02-23 15:01:15

回答

0
Login Strategy 


    // passport/login.js 
     passport.use('login', new LocalStrategy({ 
      passReqToCallback : true 
      }, 
      function(req, username, password, done) { 
      // check in mongo if a user with username exists or not 
      User.findOne({ 'username' : username }, 
       function(err, user) { 
       // In case of any error, return using the done method 
       if (err) 
        return done(err); 
       // Username does not exist, log error & redirect back 
       if (!user){ 
        console.log('User Not Found with username '+username); 
        return done(null, false, 
         req.flash('message', 'User Not found.'));     
       } 
       // User exists but wrong password, log the error 
       if (!isValidPassword(user, password)){ 
        console.log('Invalid Password'); 
        return done(null, false, 
         req.flash('message', 'Invalid Password')); 
       } 
       // User and password both match, return user from 
       // done method which will be treated like success 
       return done(null, user); 
       } 
      ); 
     })); 

我們現在定義爲以下模塊中需要護照的實例的應用程序我們的路線在上面的app.js中創建。將此模塊保存在

module.exports = function(passport){ 

     /* GET login page. */ 
     router.get('/', function(req, res) { 
     // Display the Login page with any flash message, if any 
     res.render('index', { message: req.flash('message') }); 
     }); 

     /* Handle Login POST */ 
     router.post('/login', passport.authenticate('login', { 
     successRedirect: '/home', 
     failureRedirect: '/', 
     failureFlash : true 
     })); 

     /* GET Registration Page */ 
     router.get('/signup', function(req, res){ 
     res.render('register',{message: req.flash('message')}); 
     }); 

     /* Handle Registration POST */ 
     router.post('/signup', passport.authenticate('signup', { 
     successRedirect: '/home', 
     failureRedirect: '/signup', 
     failureFlash : true 
     })); 

     return router; 
    } 
相關問題