2017-06-25 59 views
1

我試圖獲得與PassportJS用戶身份驗證的句柄,我無法讓它工作我的數據庫設置。PassportJS本地策略不工作Withh MongoDB

我正在使用MongoDB 沒有 Mongoose,我不能讓LocalStrategy模塊工作。

希望我的數據庫查詢不會太麻煩。

本地策略:

passport.use(new LocalStrategy(
function(username, password, done) { 
//Fire up database 
mongo.connect("mongodb://localhost:27017/formulas", function(e, db) { 
    if (e) {return next(e);} 
    var col = db.collection("users"); 
    //Do a database query to find a record by username 
     col.findOne({"username": username}, function(err, user){ 
     if (err) { return done(err);} 
     if(!user) { 
      return done(null, false, { message: "Please check your log in credentials." }); 
     } 
     //if it exists call done() object with user information 
     bcrypt.compare(password, user.password, function(err, res){ 
      if (err) throw err; 
      if (res == true) { 
      return done(null, {username: username, password: password}); 
      } else { 
      return done(null, false, { message: "Invalid password."}); 
      } 
     }); 
     }); 
    }); 
    })); 

我打電話passport.authenticate()這樣的:

router.post('/login', 
passport.authenticate('local', {successRedirect:'/', failureRedirect:'/about',failureFlash: false}), 
function(req, res){ 
    console.log(req.body); 
    console.log(req.user); 
    console.log("The user was logged"); 
}); 

SerializeUserdeserializeUser是這樣的:

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

passport.deserializeUser(function(id, done) { 
    mongo.connect("mongodb://localhost:27017/formulas", function(e, db){ 
    if (e) {return next(e);} 
    var col = db.collection("users"); 
    col.findOne({"username": id}, function(err, user){ 
    done(err, {"username": id}); 
    }); 
}); 
}); 

當我打電話app.post(/login)我被帶到​​,沒有任何東西被記錄到控制檯,所以我不太清楚發生了什麼問題。

有關如何解決或如何排除故障的建議非常感謝。

回答

1

首先,當你序列化用戶對象,然後在反序列化也必須通過整個用戶對象。 考慮下面的例子。

對於路線:

router.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     req.session.user = req.user; 
     return res.redirect('/home'); 
    }); 
    })(req, res, next); 
}); 

對於passport.js,放在同一個文件夾

var passport = require('passport'), 
session = require('express-session'); 
var local = require('./localstrategy.js'); 
module.exports = function (app) { 
    app.use(session({ 
    secret: 'Site visit', 
    resave: true, 
    saveUninitialized: true, 
    cookie: { secure: false } 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    passport.serializeUser(function(user, done){ 
    done(null, user); 
}); 
passport.deserializeUser(function(user, done){ 
    done(null, user); 
}); 
local(); 
}; 

的localstrategy和護照對於本地策略:

'use strict'; 
var passport = require('passport'), 
local = require('passport-local').Strategy; 
var user; 
// path where the db.js is placed 
var db = require('./../db.js'); 
var ObjectId = db.getObjectID(); 
var bcrypt = require('bcrypt'); 

module.exports = function(){ 
    passport.use(new local({ 
    usernameField : 'username', 
    passwordField : 'password' 
    }, function(username, password, done){ 
    var collection = db.getDb().collection('users'); 
    collection.findOne({ 
     username: username, 
    }, function (err, result) { 
     if(result == null){ 
      cb(null, false); 
     }else { 
      bcrypt.compare(password, result.password, function (err, passRes) { 
       if (passRes == true) { 
       user = user; 
       done(err, user); 
       }else{ 
        done(null, false, { message : 'Invalid Password'}); 
       }  
      }); 
     } 
    }); 
    })); 
};