使用Express 4 + Passport JS(LocalStrategy)+ MongoDB(Mongoose)+会话在路线上创建新会话

时间:2014-06-25 17:28:56

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

有人可以解释为什么每次我打电话给我的快递服务器时都会创建一个新会话。

问题在于,一旦创建了新会话,它就不会包含针对护照属性的用户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);
                });
            })
    );
};

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

:)

1 个答案:

答案 0 :(得分: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解析器需要与快速会话具有相同的秘密。