passport.js req.user 未定义
passport.js req.user is undefined
我正在构建一个带有 express 并使用护照进行身份验证的 nodejs 应用程序。我是该平台的相对初学者,只使用了 3 周。我 运行 遇到了问题,因为我的服务器不保存用户信息。
我可以使用 MongoDB 作为我的数据库源正确登录。信息是从数据库中正确获取的,并且似乎可以通过护照正确验证。但是,信息不会持续存在,重定向时 req.user 未定义。
我尝试了几个小时重新排序中间件并搜索了其他问题和答案,但似乎没有任何效果!我真的不知道怎么了。
app.js
`
const express = require('express');
const app = express();
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname + '/views');
const http = require('http').Server(app);
const cookieParser = require('cookie-parser');
const session = require('express-session');
const flash = require('connect-flash');
const passport = require('passport');
const io = require('socket.io')(http);
const mongo = require('./controllers/mongo');
var ObjectID = require('mongodb').ObjectID;
app.use(express.urlencoded({extended : false}));
app.set('view engine', 'ejs');
app.use(require('express-useragent').express());
app.use(cookieParser());
app.use(session({
secret : 'secret',
resave : true,
saveUninitialized : true
}));
app.use(flash());
app.use((req,res,next)=> {
res.locals.success_msg = req.flash('success_msg');
res.locals.error_msg = req.flash('error_msg');
res.locals.error = req.flash('error');
next();
})
app.use(passport.initialize());
app.use(passport.session());
//router
const router = express.Router();
async function start_app() {
await mongo.init();
require("./controllers/passport")(passport);
require("./controllers/gameio")(io);
app.use('/forums', require('./routes/forums'));
app.use('/user', require('./routes/users'));
app.use('/tournaments', require('./routes/tournaments'));
app.use('/members', require('./routes/memberlist'));
app.use('/profile', require('./routes/profile'));
app.use('/lobby', require('./routes/lobby'));
app.use('/game', require('./routes/game'));
app.use('/watch', require('./routes/watch'));
}
start_app();
const server = http.listen(8080, function() {
console.log('listening on *:8080');
});
module.exports = router;
`
护照配置
`
const express = require('express');
const router = express.Router();
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const { dbo } = require('../controllers/mongo');
module.exports = function(passport) {
passport.use(
new LocalStrategy({usernameField : 'email'},async function(email,password,done) {
//match user
await dbo.getUser({userEmail : email})
.then((user)=>{
if(!user) {
return done(null,false,{message : 'that email is not registered'});
}
console.log(user); // returns the relevant chunk of the user table fetched
//match pass
bcrypt.compare(password,user.userPassword,(err,isMatch)=>{
if(err) throw err;
if(isMatch) {
return done(null,user);
} else {
return done(null,false,{message : 'pass incorrect'});
}
})
})
.catch((err)=> {console.log(err)})
})
)
passport.serializeUser(function(user, done) {
console.log(user); // returns the relevant chunk of the user table fetched
done(null, user);
});
passport.deserializeUser(function(id, done) {
done(null, null);
});
};
`
用户登录页面
`
router.post('/login',(req,res,next)=>{
passport.authenticate('local',{
successRedirect : '/forums',
failureRedirect : '/user/login',
failureFlash : true,
})(req,res,next);
})
`
serializeUser
决定用户对象的哪些数据应该存储在session中 deserializeUser
deserializeUser的第一个参数对应于给done函数的用户对象的key,所以这样做:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
我正在构建一个带有 express 并使用护照进行身份验证的 nodejs 应用程序。我是该平台的相对初学者,只使用了 3 周。我 运行 遇到了问题,因为我的服务器不保存用户信息。
我可以使用 MongoDB 作为我的数据库源正确登录。信息是从数据库中正确获取的,并且似乎可以通过护照正确验证。但是,信息不会持续存在,重定向时 req.user 未定义。
我尝试了几个小时重新排序中间件并搜索了其他问题和答案,但似乎没有任何效果!我真的不知道怎么了。
app.js `
const express = require('express');
const app = express();
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname + '/views');
const http = require('http').Server(app);
const cookieParser = require('cookie-parser');
const session = require('express-session');
const flash = require('connect-flash');
const passport = require('passport');
const io = require('socket.io')(http);
const mongo = require('./controllers/mongo');
var ObjectID = require('mongodb').ObjectID;
app.use(express.urlencoded({extended : false}));
app.set('view engine', 'ejs');
app.use(require('express-useragent').express());
app.use(cookieParser());
app.use(session({
secret : 'secret',
resave : true,
saveUninitialized : true
}));
app.use(flash());
app.use((req,res,next)=> {
res.locals.success_msg = req.flash('success_msg');
res.locals.error_msg = req.flash('error_msg');
res.locals.error = req.flash('error');
next();
})
app.use(passport.initialize());
app.use(passport.session());
//router
const router = express.Router();
async function start_app() {
await mongo.init();
require("./controllers/passport")(passport);
require("./controllers/gameio")(io);
app.use('/forums', require('./routes/forums'));
app.use('/user', require('./routes/users'));
app.use('/tournaments', require('./routes/tournaments'));
app.use('/members', require('./routes/memberlist'));
app.use('/profile', require('./routes/profile'));
app.use('/lobby', require('./routes/lobby'));
app.use('/game', require('./routes/game'));
app.use('/watch', require('./routes/watch'));
}
start_app();
const server = http.listen(8080, function() {
console.log('listening on *:8080');
});
module.exports = router;
`
护照配置 `
const express = require('express');
const router = express.Router();
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const { dbo } = require('../controllers/mongo');
module.exports = function(passport) {
passport.use(
new LocalStrategy({usernameField : 'email'},async function(email,password,done) {
//match user
await dbo.getUser({userEmail : email})
.then((user)=>{
if(!user) {
return done(null,false,{message : 'that email is not registered'});
}
console.log(user); // returns the relevant chunk of the user table fetched
//match pass
bcrypt.compare(password,user.userPassword,(err,isMatch)=>{
if(err) throw err;
if(isMatch) {
return done(null,user);
} else {
return done(null,false,{message : 'pass incorrect'});
}
})
})
.catch((err)=> {console.log(err)})
})
)
passport.serializeUser(function(user, done) {
console.log(user); // returns the relevant chunk of the user table fetched
done(null, user);
});
passport.deserializeUser(function(id, done) {
done(null, null);
});
};
`
用户登录页面 `
router.post('/login',(req,res,next)=>{
passport.authenticate('local',{
successRedirect : '/forums',
failureRedirect : '/user/login',
failureFlash : true,
})(req,res,next);
})
`
serializeUser
决定用户对象的哪些数据应该存储在session中 deserializeUser
deserializeUser的第一个参数对应于给done函数的用户对象的key,所以这样做:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});