【问题标题】:PassportJS Local Strategy not working Withh MongoDBPassport JS 本地策略不适用于 MongoDB
【发布时间】:2017-06-29 12:31:40
【问题描述】:

我正在尝试使用 PassportJS 处理用户身份验证,但我无法让它在我的数据库设置中工作。

我正在使用 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) 时,我被直接带到/about 并且没有任何内容记录到控制台,所以我不太确定出了什么问题。

非常感谢您提供有关修复什么或如何排除故障的建议。

【问题讨论】:

    标签: node.js mongodb express passport.js


    【解决方案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 ,将 localstrategy 和 passport 放在同一个文件夹中

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

    本地策略:

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

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2017-02-25
      • 2014-04-10
      • 2023-04-05
      • 1970-01-01
      • 2016-03-08
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多