2016-01-12 19 views
1

我正在嘗試使用我在http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619中找到的教程進行登錄工作。我修改了代碼以使用Sequelize。我能夠驗證用戶名和密碼,但在序列化用戶之後,它重定向到的頁面無法加載。我想知道是否有我錯過的東西。序列化用戶後PassportJS(本地)與Sequelize和Express卡在掛起

我沒有真正收到錯誤,但重定向到/測試/主頁卡在掛起,並且它不斷執行發佈請求。它似乎沒有運行req.isAuthenticated()或者

Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."username" = 'user14' LIMIT 1; 
username and password matched 
serializing user: 
POST /test/login 302 377.738 ms - 64 
Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; 
GET /test/home - - ms - - 
Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; 
POST /test/home - - ms - - 
Executing (default): SELECT "id", "email", "username", "password" FROM "users" AS "user" WHERE "user"."id" = 16; 
POST /test/home - - ms - - 

這裏是我的app.js的一個片段:

// configuring passport 
var passport = require('passport'); 
var expressSession = require('express-session'); 
app.use(expressSession({ secret: 'keyboard cat', resave: false, saveUninitialized: false })); 
app.use(passport.initialize()); 
app.use(passport.session()); 

// initialize passport 
var initPassport = require('./passport/init'); 
initPassport(passport); 

// routes 
var routes = require('./routes/index'); 
var loginTest = require('./routes/test')(passport); 
var gameRoute = require('./routes/game'); 
app.use('/', routes); 
app.use('/test', loginTest); 
app.use('/game', gameRoute); 

init.js:

var login = require('./login'); 
var User = require('../server/models/index').user; 

module.exports = function(passport){ 
    passport.serializeUser(function(user, done) { 
     console.log('serializing user: '); 
     done(null, user.get('id')); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.findById(id, function(err, user) { 
      console.log('deserializing user:',user); 
      done(err, user); 
     }); 
    }); 

    // setting up Passport Strategies for Login 
    login(passport); 

} 

test.js (路由器)

var express = require('express'); 
var router = express.Router(); 

var isAuthenticated = function (req, res, next) { 
    if (req.isAuthenticated()) 
     return next(); 
    res.redirect('/test'); 
} 

module.exports = function(passport){ 

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


    /* GET Home Page */ 
    router.get('/home', isAuthenticated, function(req, res){ 
     res.render('home', { user: req.user }); 
    }); 

    return router; 
} 

login.js

var LocalStrategy = require('passport-local').Strategy; 
var User = require('../server/models/index').user; 
var bCrypt = require('bcrypt-nodejs'); 

module.exports = function(passport){ 

    passport.use('login', new LocalStrategy({ 
      passReqToCallback : true 
     }, 
     function(req, username, password, done) { 
     // check if user with username exists or not 
     User.findOne({ 
      where: { 
      username: username 
      } 
     }).then(function(user) { 
      if (!user){ 
       console.log('User Not Found with username '+username); 
       return done(null, false, { message: 'Incorrect username.' });  
      } 
      if (!isValidPassword(user, password)){ 
       console.log('Invalid Password'); 
       return done(null, false, { message: 'Incorrect password.' }); 
      } 
      console.log('username and password matched'); 
      return done(null, user); 
      } 
     ); 

     }) 
); 

    var isValidPassword = function(user, password){ 
    return bCrypt.compareSync(password, user.password); 
    } 

} 

回答

2

經過一番研究,我意識到造成這個問題的原因是deserializing。我的console.log沒有給我一個錯誤,因爲它卡在User.findById(...)。 Sequelize不會返回回調,而是返回一個承諾。

不要使用此爲init.js的,

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    console.log('deserializing user:',user); 
    done(err, user); 
    }); 
}); 

使用此語法代替

passport.deserializeUser(function(id, done) { 
    User.findById(id).then(function(user) { 
    console.log('deserializing user:',user); 
    done(null, user); 
    }).catch(function(err) { 
    if (err) { 
     throw err; 
    } 
}); 
}); 
相關問題