2017-07-17 7 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の投稿要求が正しいデータの後に/にリダイレクトされます。ここでconsole.log(req.user)は正しいユーザーを表示します。また、req.sessionオブジェクトにも追加されています。

/loginへのリンクをたどった後は、req.userのチェックの後で私にリダイレクトされますが、undefinedが返されます。 mongoのセッションは正しく保存されています。

パスポートが正しくセッションを保存していないようです。

+1

問題の1つは、常に 'done'コールバックを2度実行する' deserializeUser'メソッドです。 'if'文では、関数から出るために' return done(null、user); 'を使います。 –

+0

ありがとうございます!これを回答として投稿することができますので、選択することができます。 –

答えて

0

deserializeUserメソッドでは、常にdoneコールバックを2回実行するという問題があります。 if文では、関数から出るにはreturn done(null, user);を使うべきです。

関連する問題