2015-11-03 89 views
1

我正在嘗試使用護照本地身份驗證與續集。當我提交登錄表單時,請求/響應週期永遠不會結束,並且終端中沒有錯誤消息。護照js本地身份驗證使用sequelize

這裏是我的全部代碼:

app.js

var Sequelize = require('sequelize'), 
    express = require('express'), 
    bodyParser = require('body-parser'), 
    cookieParser = require('cookie-parser'), 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('./models/users'); 
    ........ and other imports..... 

    //route import , model injection 
    var auth = require('./routes/auth')(User); 

    ....................... 
app.use(session({ 
    store: new RedisStore(), 
    secret: 'keyboard cat', 
    resave: false, 
    saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

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

passport.deserializeUser(function(id, done) { 
    User.findById(id).then(function(user){ 
     done(null, user); 
    }).catch(function(e){ 
     done(e, false); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
     User.findOne({where: {username: username}}).then(function(err, user) { 
      if (err) { return done(err); } 
      if (!user) { 
       console.log('Incorrect username.'); 
       return done(null, false, { message: 'Incorrect username.' }); 
      } else if (password != user.password) { 
       console.log('Incorrect password'); 
       return done(null, false, { message: 'Incorrect password.' }); 
      } else { 
       console.log('ok'); 
       done(null, user); 
      } 
     }); 

    } 

)); 

和路線/ auth.js:

var express = require('express'), 
    passport = require('passport'); 

var routes = function(User) { 
    var router = express.Router(); 

    // routes for registration 
    router.route('/register') 
     .get(function(req, res) { 
      res.render('register'); 
     }) 
     .post(function(req, res) { 
      User.count().then(function(number) { 
       if (number >= 1) { 
        res.redirect('/auth/login'); 
       } else { 
        User.create({ 
         username: req.body.username, 
         password: req.body.password 
        }); 

        res.redirect('/auth/login'); 
       } 
      }); 
     }); 
    //routes for login 
    router.route('/login') 
     .get(function(req, res) { 
      res.render('login'); 
     }) 
     .post(function(req, res) { 
      passport.authenticate('local', { successRedirect: '/dashboard', 
       failureRedirect: '/auth/login' }); 

     }); 
    return router; 
}; 

module.exports = routes; 

回答

2

爲什麼請求/響應週期不會結束?

您當前的'./login'POST的中間件定義不正確,不會發送響應,這就是爲什麼它不會結束(直到超時)。

代替在中間件功能中調用passport.authenticate,調用passport.authenticate的結果應該用作中間件本身。我建議如下:

router.route('/login') 
    .get(function(req, res) { 
     res.render('login'); 
    }) 
    .post(passport.authenticate('local', { successRedirect: '/dashboard', 
      failureRedirect: '/auth/login' }); 
    ); 

查看http://passportjs.org/docs/authenticate爲例。在註冊碼

你沒問這個,但有一個競爭條件在你的中間件「./register」 POST

競爭狀態。

User.create返回保存創建的用戶的承諾。在該承諾解決之前,不保證該用戶存在於後備數據存儲中。但是,在調用create之後,您的代碼會立即重定向到將爲該用戶查詢數據庫的登錄端點。

下面是一些代碼,避免了這個問題:

User.create({ ... }) 
.then(function() { 
    res.redirect('/auth/login'); 
}) 
.catch(function(err) { 
    // Handle rejected promise here 
}) 

catch包括因爲它始終是很好的做法來處理被拒絕的承諾和拋出的異常。

+0

特別感謝在我的代碼中指出競爭條件 – pyprism

相關問題