PassportJsauthentication无限循环和执行(默认)查询

我正在尝试使用PassportJs和Sequelize构build身份validation系统。 我自己使用Sequelize制作了注册系统。 我只想使用PassportJS进行login。

它不会将我redirect到failureRedirect路由,对于SuccessRedirect也不会redirect,但是当提交表单时,它会进入无限循环,并在我的控制台中显示以下消息:

Executing (default): SELECT `id`, `username`, `lastName`, `password`, `email`, `phone`, `createdAt`, `updatedAt` FROM `user` AS `user` LIMIT 1; 

我的项目的结构是:users_model.js,index.js和users.js(控制器)。

我在我的index.js中的代码如下所示:

 //===============Modules============================= var express = require('express'); var bodyParser = require('body-parser'); var session = require('express-session'); var authentication= require('sequelize-authentication'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var passportlocal= require('passport-local'); var passportsession= require('passport-session'); var User = require('./models/users_model.js'); passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); console.log(id); }); }); var users= require('./controllers/users.js'); var app = express(); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use('/users', users); app.use('/events', events); //-------------------------------------------Setup Session------------ app.use(session({ secret: "ceva", resave:true, saveUninitialized:true, cookie:{}, duration: 45 * 60 * 1000, activeDuration: 15 * 60 * 1000, })); // Passport init app.use(passport.initialize()); app.use(passport.session()); //------------------------------------------------Routes---------- app.get('/', function (req, res) { res.send('Welcome!'); }); //-------------------------------------Server------------------- app.listen(3000, function () { console.log('Example app listening on port 3000!'); }); 

在我的控制器中,我使用Sequelize自己完成了注册系统。 在users.js中,我有:

 var express = require('express'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var passportlocal= require('passport-local'); var passportsession= require('passport-session'); var router = express.Router(); var User = require('../models/users_model.js'); //____________________Initialize Sequelize____________________ const Sequelize = require("sequelize"); const sequelize = new Sequelize('millesime_admin', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } }); //________________________________________ router.get('/',function(req,res){ res.send('USERS'); }); router.get('/register', function(req, res) { res.render('registration', {title: "Register" }); }); router.post('/register', function(req, res) { var email = req.body.email; var password = req.body.password; var username= req.body.username; var lastname= req.body.lastname; var phone= req.body.phone; User.findAll().then(user => { usersNumber = user.length; x=usersNumber+1; var y =usersNumber.toString(); var uid='ORD'+ y; User.sync().then(function (){ return User.create({ id:uid, email: email, password:password, username: username, lastName: lastname, phone: phone, }); }).then(c => { console.log("User Created", c.toJSON()); res.redirect('/users'); }).catch(e => console.error(e)); }); }); router.get('/login',function(req,res){ res.render('authentication'); }); //router.post('/login', function(req, res, next) { // console.log(req.url); // '/login' // console.log(req.body); // I got these:{ username: 'username', password: 'parola' } // passport.authenticate('local', function(err, user, info) { // console.log("authenticate"); // console.log('error:',err); // console.log('user:',user); // console.log('info:',info); // })(req, res, next); //}); router.post('/login', passport.authenticate('local', { successRedirect: '/events', failureRedirect: '/users/register' })); router.get('/logout', function(req, res){ req.logout(); res.redirect('/users/login'); }); //__________________________________________ module.exports = router; 

主要问题: 不是无限循环,而是Sequelize的使用不正确

这不是一个无限循环,而是一个来自服务器的悬挂响应,以超时错误结束。

当你这样做:

 passport.use(new LocalStrategy( function(username, password, done) { ... } )); 

passportexpress等待donefunction被称为。 一旦done() ,他们就在中间件链中向前发送响应给客户端。

done函数没有被调用,因为Sequelize似乎不支持callback函数,但承诺。 所以,调用Sequelize方法的正确方法是:

 User.findOne({ username: username }).then(user => { if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect password.' }); } done(null, user); }).catch(err => done(err)); 

(de)序列化会话用户

似乎在用户实例中没有id字段,但userid 。 所以我们必须这样做:

 passport.serializeUser(function(user, done) { done(null, user.userid); }); passport.deserializeUser(function(id, done) { User.findOne({ userid: id }).then(user => { done(null, user); console.log(id); }).catch(err => done(err)); }); 

作为参考, 这个提交修复了这些问题。