NodeJs Passport Auth

时间:2018-05-04 07:32:16

标签: node.js

我对passport.js有疑问,当我尝试登录我的帐户时,出现错误:错误:未知的身份验证策略“local-login”。 “。我的代码有什么问题,谢谢。

配置/ Passport.js

var passport        = require('passport');
var request         = require('request');
var LocalStrategy   = require('passport-local').Strategy;
var User            = require('../models/user'); // model User
passport.serializeUser(function (user, done) {
   done(null, user.id);
});
passport.deserializeUser(function (id, done) {
   User.findById(id, function (err, user) {
       done(err, user);
   });
});
passport.use('local-login', new LocalStrategy(function(username, password,  
done) {
   User.findOne({ username: username }, function(err, user) {
       if (err) { return done(err); }
       if (!user) {
           return done(null, false, { msg: "Username" + username + "not found." 
});   
    }
    user.comparePassword(password, function(err, isMatch) {
        if (err) { return done(err); }
        // Make sure the user has been verified
        if (isMatch) {
            return done(null, user);
        }
        return done(null, false, { msg: 'Invalid email or password.' });
    });
});
}));

app.js

var session             = require('express-session');
var passport            = require('passport');
app.use(session({
   secret: config.secret,
   resave: true,
   saveUninitialized: true,
   cookie: { maxAge: 1*15*1000 }
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next)  {
   res.locals.user = req.user;
   next();
});

路由/ authRoutes.js

app.post('/login', function(req, res, next) {
passport.authenticate('local-login', 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); }
        res.redirect('/');
    });
})(req, res, next);
});

1 个答案:

答案 0 :(得分:0)

必须是'本地'而不是'本地登录'

module.exports.login_post = passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/',
    failureFlash: true
});

我使用MySQL。这是完整的代码:

passport.use(new LocalStrategy({
    passReqToCallback: true
}, function(req, username, password, done) {
    pool.query("SELECT * FROM user WHERE username = ?",[username], function(err, rows, fields) {
        if (err) throw err;
        console.log('checked');
        if(!isExist(username) || !isExist(password)){
            return done(null, false, req.flash('message_err', 'Username and password cant be emptied!.'));
        }
        if (!rows[0]) {
            return done(null, false, req.flash('message_err', 'Oops! Username or password didnt match.'));
        }
        if (!bcrypt.compareSync(password, rows[0].password)) {
            return done(null, false, req.flash('message_err', 'Oops! Username/password didnt match.'));
        }
        return done(null, rows[0]);
    });
}));

passport.deserializeUser(function(user, done) {
    console.log('user : ' + user);
    pool.query("SELECT * FROM user WHERE username = ?", [user], function(err, rows, fields) {
        if(err) throw err;
        console.log('deserialized');
        done(err, rows[0]);
    });
});
//serialize and deserialize passport
passport.serializeUser(function(req, user, done) {
    console.log('serialized');
    done(null, user.username, req.flash('message_success', 'Welcome, '+user.username + "!"));
});

module.exports.login_post = passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/',
    failureFlash: true
});