2017-07-17 197 views
0

我正在尝试将passport整合到我的node.js应用程序中。passport.js会话重定向后丢失

app.js文件

const app = express(); 
app.set('view engine', 'pug'); 
app.use('/libs', express.static('node_modules')); 

require('../config/auth.config')(app, data, passport); 
app.use((req, res, next) => { 
    res.locals.user = req.user; 
    next(); 
}); 

app.get('/', (req, res) => { 
     // those objects are populated correctly after redirect from auth middleware 
     console.log(req.session) 
     console.log(req.user) 
     return res.render('home'); 
    }); 
app.get('/login', console.log(req.user); 
     // req.user is undefined here 
     if (req.user) { 
      return res.redirect('/'); 
     } 

     return res.render('login');); 
app.post('/login', passport.authenticate('local', { 
    successRedirect: '/', 
    failureRedirect: '/login', 
})); 

auth.config.js

const express = require('express'); 
const session = require('express-session'); 
const cookieParser = require('cookie-parser'); 
const bodyParser = require('body-parser'); 
const LocalStrategy = require('passport-local'); 
const MongoStore = require('connect-mongo')(session); 
const config = require('./config'); 

const configAuth = (app, { 
    users 
}, passport, db) => { 
    app.use(cookieParser('Purple Unicorn')); 
    app.use(bodyParser.urlencoded({ 
     extended: true, 
    })); 
    app.use(bodyParser.json()); 
    app.use(session({ 
     store: new MongoStore({ 
      url: config.connectionString 
     }), 
     secret: 'Purple Unicorn', 
     resave: true, 
     saveUninitialized: true, 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

    passport.use(new LocalStrategy((username, password, done) => { 
     return users.login(username, password) 
      .then((user) => { 
       if (user) { 
        return done(null, user); 
       } 
       return done(null, false); 
      }); 
    })); 

    passport.serializeUser((user, done) => { 
     done(null, user._id); 
    }); 

    passport.deserializeUser((id, done) => { 
     users.getUserById(id) 
      .then((user) => { 
       console.log(user); 
       if (user) { 
        done(null, user); 
       } 

       done(null, false); 
      }); 
    }); 

    app.use((req, res, next) => { 
     res.locals = { 
      user: req.user, 
     }; 
     next(); 
    }); 
}; 

module.exports = configAuth; 

该数据对象是否正常工作。

/login POST请求用正确的数据后,我重定向到/其中console.log(req.user)打印正确的用户。它也被添加到req.session对象中。

当我按照指向/login的链接之后,它应该在检查req.user后重定向我,但返回undefined。 mongo中的会话存储正确。

看起来护照没有正确保存会话。

+1

其中一个问题是你的'deserializeUser'方法,你总是执行两次'done'回调。在'if'语句中,您可以使用'return done(null,user);'从函数中退出; –

+0

谢谢!你可以把它作为答案发布,所以我可以选择它。 –

回答

0

问题出在您的deserializeUser方法,您总是运行done回调两次。在if语句中,您应该使用return done(null, user);从函数中退出;