1

Итак, я создаю веб-приложение с использованием изоморфных-редуктов и React.js. В настоящее время я пытаюсь получить базовую аутентификацию, используя паспорт в 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 
}); 

Это создает магазин MongoDB используя connect-mongo - я уверен, что это может быть сделано с mongoose как хорошо, но я не знаю, как так я оставлю его как упражнение для читателя :-)

Тогда вы можете сказать модуль экспресс-сессии, чтобы использовать этот магазин:

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