与明文护照:序列化问题与自定义身份validation方法

#set up passport LocalStrategy = require('passport-local').Strategy passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) -> User.findOne({ email: email }, (err, user) -> console.log("findone") if err? console.log "error" return done(err) if not user console.log("incorrect username") return done(null, false, { message: 'Incorrect username.' }) if password isnt user.password console.log "NOT" return done(null, false, {message: "Incorrect password" }) console.log "BUT YESS" done(null,user) ) )) passport.serializeUser((user, done) -> done(null, user._id) ) passport.deserializeUser((id, done) -> User.findById(id, (err, user) -> done(err, user) ) ) 

我使用的是http://passportjs.org/guide/username-password/上的LocalStrategy示例

现在,我的问题是,如果我input一个错误的密码,或者一个不正确的用户名,我得到一个错误Error: failed to serialize user into session

实际上,在我的serializeUser函数中, userfalse 。 这可能是因为代码从字面上返回false作为上面的第二个参数return done(null, false, {message: "Incorrect password" })

但这是从文档! 那么我做错了什么? 为什么参数不正确时会出现序列化问题? 当参数正确(用户名和密码正确),我可以login没有问题

编辑:在@robertklep评论这里是我如何使用身份validationfunction。 事实上,因为我需要根据angular色进行不同的路由,所以我使用护照自定义方法(此问题的标题添加了此详细信息):

 app.post '/login', (req, res, next) -> passport.authenticate('local', (err, user, info) -> return next(err) if err? return res.redirect('/login', { message: req.flash('Access denied')}) if not user? req.logIn user, (err) -> if err? console.log "err! " + err res.redirect("/", { message: req.flash(err)}) return if user.role is "admin" or user.role is "auditor" res.redirect("/dashboard") else res.redirect("/start") )(req, res, next) 

 passport.use(new LocalStrategy( function(username, password, done) { user.findOne({ username: username }, function (err, user) { if (err) { return done(err); } //check for incorrect username if (!user) { return done(null, false, { message: 'Incorrect username.' }); } //incorrect password for the selected username if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } return done(null, user); }); } )); app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user,info) { if (err) { //console.log(info); return next(err); } if (!user) { console.log(info); return res.redirect('/login'); } req.logIn(user, function(err) { if (err) { return next(err); } return res.redirect('https://www.google.co.in' ); }); })(req, res, next); }); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(login, done) { user.findById(login._id, function(err, user) { done(err, user); }); }); 
 app.post '/login', (req, res, next) -> passport.authenticate('local', (err, user, info) -> console.log "authenticate callback" if err? console.log "err in authenticate callback" return next(err) if not user console.log "User NOT in auth callback" req.flash("Accesso no otorgado", info.message) return res.redirect('/login') 

我重写了一下validationfunction。 而不是if not user? ,解决的办法是使用, if not user (没有问号!),因为“用户”返回只是布尔值设置为错误时,出事了。