【问题标题】:Express session not storing session快速会话不存储会话
【发布时间】:2016-07-06 20:39:57
【问题描述】:

所以我正在使用 isomorphic-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;

当我登录时,它能够序列化会话,但是由于我猜,会话不会被存储,它不会反序列化会话。

【问题讨论】:

    标签: express reactjs session-cookies passport.js express-session


    【解决方案1】:

    如果您希望会话持久,您需要告诉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 完成,但我不知道如何,所以我将把它作为练习留给读者 :-)

    然后你可以告诉 express-session 模块使用这个 store:

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

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2012-05-03
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多