1

Also ich eine Web-Anwendung mit Isomorphic-Redux und React.js erstellen. Ich versuche derzeit, grundlegende Authentifizierung mit Pass in Node.js arbeiten zu bekommen. Ich habe jedoch ein Problem festgestellt, bei dem meine Cookie-Sitzung nicht in den Browser geladen wird, wenn ich mich anmelde.Express-Sitzung nicht Sitzung speichern

Hier ist eine verkürzte Version des Codes, den ich bisher geschrieben habe.

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; 

Wenn ich log es ist in der Lage, die Sitzung zu serialisieren, aber da ich rate, wird die Sitzung nicht gespeichert, es deserialisiert die Sitzung nicht.

Antwort

0

Wenn die Sitzungen dauerhaft sein sollen, müssen Sie dem Modul express-session mitteilen, wo diese gespeichert werden sollen. Zuerst müssen Sie ein Geschäft aufbauen:

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

Dies schafft einen mongoDB Speicher mit connect-mongo - ich bin sicher, dass dies auch mit mongoose getan werden kann, aber ich weiß nicht, wie so läßt ich werde es als eine Übung für den Leser :-)

Dann können Sie den Express-Session-Modul sagen Sie diesen Speicher zu verwenden:

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