2016-03-20 191 views
1

所以我正在使用同构redux和React.js构建一个Web应用程序。我目前正在尝试使用Node.js中的护照获得基本身份验证。不过,当我尝试登录时,我遇到了一个问题,即我的Cookie会话似乎无法在浏览器中加载。快速会话没有存储会话

这是我迄今为止编写的代码的减少版本。

Server.js

import Express from 'express'; 
import passport from 'passport'; 
import bodyParser from 'body-parser'; 
import cookieParser from 'cookie-parser'; 
import expressSession from 'express-session'; 

import serverConfig from './config'; 

const app = new Express(); 

// Apply body Parser and server public assets and routes 
app.use(cookieParser()); 
app.use(bodyParser.json({ limit: '20mb' })); 
app.use(bodyParser.urlencoded({ limit: '20mb', extended: true })); 
app.use(expressSession({ 
    secret: serverConfig.sessionSecret, 
    resave: false, 
    saveUninitialized: false 
})); 

import pp from './passport'; 
pp(); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.js

import passport from 'passport'; 
import mongoose from 'mongoose'; 
import path from 'path'; 

import User from './models/user.model'; 

import local from './strategies/local'; 

const pp = () => { 
    // Serialize sessions 
    passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

    // Deserialize sessions 
    passport.deserializeUser(function(id, done) { 
     User.findOne({ 
      _id: id 
     }, '-salt -password', function(err, user) { 
      done(err, user); 
     }); 
    }); 

    local(); 
} 

export default pp; 

./strategies/local.js

import passport from 'passport'; 
import passportLocal from 'passport-local'; 
import mongoose from 'mongoose'; 

const LocalStrategy = passportLocal.Strategy; 
const User = mongoose.model('User'); 

const local =() => { 
    passport.use(new LocalStrategy({ 
     usernameField: 'username', 
     passwordField: 'password' 
    }, 
    (username, password, done) => { 
     User.findOne({ username: username }, (err, user) => { 
     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, { 
      message: 'Unknown user or invalid password' 
      }); 
     } 
     if (!user.authenticate(password)){ 
      return done(null, false, { 
      message: 'Unknown user or invalid password' 
      }); 
     } 
     return done(null, user); 
     }); 
    } 
)); 
} 

export default local; 

当我登录在它能够序列化会话,但是因为我猜测,会话不会被存储,它不反序列化会话。

回答

0

如果您希望会话保持持久性,您需要告知express-session模块在哪里存储它们。首先,你需要建立一个商店:

var MongoStore = require('connect-mongo')(expressSession); 
var oneHour = 3600; 
var sessionStore = new MongoStore({ 
    url: 'mongodb://localhost:27017/my-session-store', 
    touchAfter: oneHour 
}); 

这将创建使用connect-mongo一个MongoDB的商店 - 我敢肯定,这可以用mongoose做的很好,但我不知道我怎么这么会离开它作为练习读者:-)

那么你可以告诉快递会话模块使用这个店:

app.use(expressSession({ 
    secret: serverConfig.sessionSecret, 
    store: sessionStore, // <---- added store information! 
    resave: false, 
    saveUninitialized: false 
}));