[英]passport.js req.user is undefined
I'm building a nodejs app with express and using passport for authentication.我正在使用 express 构建一个 nodejs 应用程序并使用护照进行身份验证。 I'm a relative beginner to the platform having only worked with it for 3 weeks.
我是该平台的相对初学者,只使用了 3 周。 I'm running into problems as my server does not save the user information.
我遇到了问题,因为我的服务器不保存用户信息。
I can login correctly using MongoDB as my database source.我可以使用 MongoDB 作为我的数据库源正确登录。 The information is fetched correctly from the database, and it appears to validate correctly with passport.
该信息是从数据库中正确获取的,并且似乎可以通过护照正确验证。 However, the information does not persist and req.user is undefined upon redirect.
但是,信息不会持续存在,并且 req.user 在重定向时未定义。
I've tried for hours reordering middleware having searched other questions and answers but nothing seems to be working.我已经尝试了几个小时重新排序中间件并搜索了其他问题和答案,但似乎没有任何效果。 I really don't know what's wrong.
我真的不知道怎么了。
app.js `应用程序.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;
` `
passport configuration `护照配置`
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);
});
};
`
user login page `用户登录页面`
router.post('/login',(req,res,next)=>{
passport.authenticate('local',{
successRedirect : '/forums',
failureRedirect : '/user/login',
failureFlash : true,
})(req,res,next);
})
` `
serializeUser
determines which data of the user object should be stored in the session and deserializeUser
The first argument of deserializeUser corresponds to the key of the user object that was given to the done function, so do like this: serializeUser
determines which data of the user object should be stored in the session and deserializeUser
The first argument of deserializeUser corresponds to the key of the user object that was given to the done function, so do like this:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.