【问题标题】:passport.js req.user is undefinedpassport.js req.user 未定义
【发布时间】:2021-04-22 07:06:15
【问题描述】:

我正在使用 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);
 })

`

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    serializeUser 决定用户对象的哪些数据应该存储在会话中,deserializeUser deserializeUser 的第一个参数对应于用户对象的键,该键被赋予完成函数,所以这样做:

    passport.serializeUser(function(user, done) {
        done(null, user.id);
      });
      
      passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
          done(err, user);
        });
      });
    

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 2018-02-23
      • 2014-09-18
      • 2021-12-27
      • 2016-04-01
      • 2017-06-13
      • 2015-02-02
      • 2014-08-08
      相关资源
      最近更新 更多