所以我尝试使用passportjs在我的nodejs / express app中实现多个本地策略。我跟着this question和this issue,但出于某种原因我在第二个策略后使用req.user时它不存在。即使找到用户(在我的情况下是'孩子')的过程也是正确完成的。 所以这是我的passportjs配置文件:
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
const Child = require('../models/child');
const config = require('../config/database');
const bcrypt = require('bcryptjs');
module.exports = function(passport){
// Local Strategy
passport.use('user', new LocalStrategy(function(username, password, done){
// Match Username
let query = {username:username};
User.findOne(query, function(err, user){
if(err) throw err;
if(!user){
return done(null, false, {message: 'No user found'});
}
// Match Password
bcrypt.compare(password, user.password, function(err, isMatch){
if(err) throw err;
if(isMatch){
return done(null, user);
} else {
return done(null, false, {message: 'Wrong password'});
}
});
});
}));
passport.use('child', new LocalStrategy(function(username, password, done){
// Match Username
let query = {login:username};
Child.findOne(query, function(err, user){
if(err) throw err;
if(!user){
return done(null, false, {message: 'No user found1'});
}
// Match Password
bcrypt.compare(password, user.password, function(err, isMatch){
if(err) throw err;
if(isMatch){
return done(null, user);
} else {
return done(null, false, {message: 'Wrong password'});
}
});
});
}));
passport.serializeUser(function(user, done) {
var key;
if(user instanceof User) {
key = {
id: user.id,
type: 1
}
} else if (user instanceof Child) {
key = {
id: user.id,
type: 2
}
}
done(null, key);
});
passport.deserializeUser(function(key, done) {
if(key.type === 1){
User.findById(id, function(err, user) {
done(err, user);
});
} else if (key.type === 2){
Child.findById(id, function(err, user) {
done(err, user);
});
}
});
}
这是我使用策略的帖子路线:
router.post('/login',
passport.authenticate('user', {successRedirect: '/dashboard', failureRedirect: '/', failureFlash: true}),
function(req, res) {
res.redirect('/dashboard');
});
router.post('/childlogin',
passport.authenticate('child', {successRedirect: '/childDashboard', failureRedirect: '/', failureFlash: true}),
function(req, res) {
res.redirect('/childDashboard');
});
由于某些原因,当我以用户身份登录时,一切正常。我可以从/ dashboard访问req.user。但是当我尝试登录时,孩子req.user未定。尽管战略正在发挥作用。我知道它正在工作,因为如果我在孩子的策略中的“return done(null,user)”之前做“console.log(user)”,我会得到关于正确对象的完整信息。看来对象不会在app中推送和定义。有谁知道我可能做错了什么?我对nodejs / express很新,所以如果它是愚蠢的话,我不会感到惊讶。