node.js - 与 Passport 、mongodb 和 express 的持久 session

标签 node.js mongodb express passport.js

我正在使用 Passport 来处理我的应用程序中的身份验证和 session 。我正在使用 mongostore 将 session 持久化到 mongodb。

该设置通常运行良好。但是,当我重新启动服务器时,所有用户都已注销,因此显然 session 保留在内存中,而不是仅保留到 mongodb。我正在尝试实现在重新启动服务器时用户仍处于登录状态的设置。

基本配置如下

中间件

    app.use(express.cookieParser('your secret here'));
    app.use(express.session());
    app.use(passport.initialize());
    app.use(passport.session({
        maxAge: new Date(Date.now() + 3600000),
        store: new MongoStore(
            {
                db: mongodb.Db(
                    conf.mongodbName,
                    new mongodb.Server(
                        'localhost',
                        27017,
                        {
                            auto_reconnect: true,
                            native_parser: true
                        }
                    ),
                    {
                        journal: true
                    }
                )
            },
            function(error) {
                if(error) {
                    return console.error('Failed connecting mongostore for storing session data. %s', error.stack);
                }
                return console.log('Connected mongostore for storing session data');
            }
        )
    }));

Passport

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'password'
    },
    function(email, password, done) {
        console.log('user %s attempting to authenticated', email);
        return User.findOne({email:email}, function(error, user) {
            if(error) {
                console.error('Failed saving user %s. %s', user.id, error.stack);
                return done(error);
            }
            if(!user) {
                return done(null, false);
            }
            console.log('user %s logged in successfully', user.id);
            return done(null, { //passed to callback of passport.serializeUser
                id : user.id
            });
        });
    }
));

passport.serializeUser(function(user, done) {
    return done(null, user.id); //this is the 'user' property saved in req.session.passport.user
});

passport.deserializeUser(function (id, done) {
    return User.findOne({ id: id }, function (error, user) {
        return done(error, user);
    });
});

github repo(包括运行代码所需的所有代码)

我创建了一个准系统 github 存储库,其中包含代码 here

只需使用您的 mongodb 凭据(即 mongodbURL 和 mongodbName)在根目录中创建一个 conf.js 文件,运行 npm install 和 node app.js 即可开始。

谢谢

最佳答案

passport.session() 不需要任何配置,从 Express 4.X 版开始,您需要配置的是 session():

app.use(session({
  cookie : {
    maxAge: 3600000 // see below
  },
  store : new MongoStore(...)
});
...
app.use(passport.session());

另外,maxAge(应该是 cookie 的一个属性)不接受 Date 参数,而只是毫秒数 session 应该是有效的。

有关使用 express 中间件模块 session 的说明,您可以找到更多 here .

关于node.js - 与 Passport 、mongodb 和 express 的持久 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061811/

相关文章:

node.js - 无法使用 Mongoose 连接到 mongodb 图集

javascript - 如何处理没有构造函数的 JavaScript 对象

node.js - Google+ API,无需访问 token 即可调用 API

node.js 程序卡在 Amazon linux 服务器上

mongodb - 如何覆盖 MongoDB Source Connector 中的 Kafka Topic 配置?

node.js - 如何在 Node Express 应用程序中干燥需求?

javascript - 如何将我的 Node Express 应用程序限制为仅本地主机?

node.js - 如何调试 Nodejs 导致 CPU 使用率 100%

node.js - 嵌入式数组推送在 Mongoose 中不起作用 - 推送未定义

mongodb TTL 不工作