2017-06-25 1 views
1

Withh働いていません。PassportJS局所戦略は、私はPassportJSでユーザー認証のハンドルを取得しようとしている、と私はそれが私のデータベースのセットアップを動作させることはできませんMongoDBの

私はMongoDB を使用していません。マングースを使用していないため、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}); 
    }); 
}); 
}); 

私はを呼び出すとき私は​​に直接連れて行って、何もコンソールに記録されていないので、何がうまくいかないのか分かりません。修正するか、トラブルシューティングを行う方法について何の

アドバイスは大歓迎です。

答えて

1

まずuはユーザオブジェクトをシリアル化するとき、次にデシリアライズも全体ユーザオブジェクトが渡されなければなりません。 次の例を考えてみましょう。ルートの

:passport.jsについては

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); 
}); 

、同じフォルダ内に局所的な戦略については

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'}); 
       }  
      }); 
     } 
    }); 
    })); 
}; 
関連する問題