【问题标题】:New sessions being created on route with Express 4 + Passport JS (LocalStrategy) + MongoDB (Mongoose) + Sessions使用 Express 4 + Passport JS (LocalStrategy) + MongoDB (Mongoose) + Sessions 在路线上创建新会话
【发布时间】:2014-08-16 09:23:55
【问题描述】:

有人可以解释为什么每次我调用我的快速服务器时都会创建一个新会话。

问题在于,一旦创建了新会话,它就不包含针对护照属性的用户 ID。

前端的架构是 2 个 html 页面,我通过 get 路由提供服务。 (1) html页面是登录表单。 (2) html 页面是一个单页 ember 应用程序,用户只有经过身份验证(工作)才能访问

我通过 jQuery $.ajax 获取和发布数据 - 几乎就像每次我发出请求时,我都会获得一个新会话。很奇怪。

部分 app.js

server.use(cookieParser());
server.use(bodyParser.json());
server.use(bodyParser.urlencoded());
server.use(express.static(__dirname + '/public'));
server.use(session({
    name: settings.sessionName,
    secret: settings.secret,
    cookie: { maxAge: 2 * 60 * 60 * 1000 },
    store: new MongoStore({
        db: settings.database.name
    })
}));
server.use(passport.initialize());
server.use(passport.session());

require("./server/config/passport.js")(server, passport);
require("./server/routes.js")(server, passport);

passport.js

module.exports = function (server, passport) {
    var LocalStrategy = require('passport-local').Strategy;
    var User = require('../schemas/user');

    passport.serializeUser(function (user, done) {
        done(null, user._id);
    });

    passport.deserializeUser(function (id, done) {
        User.findById(id, function (error, user) {
            if (!error) done(null, user);
            else done(error, null);
        });
    });

    passport.use("local", new LocalStrategy({
                usernameField: 'email',
                passwordField: 'password',
                passReqToCallback: true
            },
            function (req, email, password, done) {
                User.findOne({ 'emailAddress': email }, function (error, user) {
                    if (error) {
                        return done(error);
                    }
                    if (!user) {
                        return done(null, false);
                    }
                    if (!user.validPassword(password)) {
                        return done(null, false);
                    }
                    return done(null, user);
                });
            })
    );
};

此时任何事情都会有所帮助。扯掉我的头发!

:)

【问题讨论】:

    标签: node.js mongodb express mongoose passport.js


    【解决方案1】:

    好的!我找到了解决方案。

    我没有将会话密码传递给 cookie 解析器。问题解决了!

    解决方法如下:

    部分 app.js

    server.use(cookieParser(settings.secret));
    server.use(bodyParser.json());
    server.use(bodyParser.urlencoded());
    server.use(express.static(__dirname + '/public'));
    server.use(session({
        name: settings.sessionName,
        secret: settings.secret,
        cookie: { maxAge: 2 * 60 * 60 * 1000 },
        store: new MongoStore({
            db: settings.database.name
        }),
    }));
    

    cookie 解析器需要与快速会话具有相同的秘密。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2022-01-11
      • 2021-10-07
      相关资源
      最近更新 更多