【问题标题】:Store user sessions: node.js, express, mongoose-auth存储用户会话:node.js、express、mongoose-auth
【发布时间】:2011-12-19 20:53:14
【问题描述】:

我有一个关于身份验证和会话的新手 node.js 问题。

我已经通过 express.js 和 mongoose-auth (mongodb) 进行了身份验证:

app.use(express.cookieParser());
app.use(express.session({ secret: 'esoognom'}));
app.use(auth.mongooseAuth.middleware());

我对所有这些员工的了解并不多。用户通过身份验证后,除非服务器重新启动,否则它们将保持不变。我想要更持久的身份验证状态,我该如何管理?

感谢您的帮助。

【问题讨论】:

    标签: javascript node.js authentication mongodb mongoose


    【解决方案1】:

    如果您希望会话在服务器崩溃/重新启动后仍然存在,那么您应该使用以下模块之一:

    您还可以在添加会话中间件时使用 maxAge 参数设置 cookie 的生命周期。例如,如果我们使用 connect-mongodb:

    app.use(express.session({
        secret : "Stays my secret",
        maxAge : new Date(Date.now() + 3600000), //1 Hour
        store  : new MongoStore({ db: 'myDB' })
    }));
    

    【讨论】:

    • 但我不明白的是如何在服务器重启后让用户登录状态保存(使用 mongoose-auth)事件。服务器重启后 req.user 未定义。
    • 使用 MongoStore 或 RedisStore 就像我在上面的消息中所说的那样。即使在重新启动后,两者都应该保留会话变量,除非您明确删除它们或过早设置到期日期(!)。
    • github.com/masylum/connect-mongodb 里面需要设置mongodb模块连接,可以用mongoose做吗?
    • 我认为这不可能。不管怎样,最好把它们分开。
    • connect-mongodb 的链接断开
    【解决方案2】:

    如果您使用 mongostore,它将比服务器重新启动更长时间。

    这可以通过 maxAge 属性进行配置。它默认为14400000,我相信它以毫秒为单位,所以是 4 小时。

    查看文档了解详情: http://senchalabs.github.com/connect/middleware-session.html

    【讨论】:

      【解决方案3】:

      我正在使用 express V2.5.11。这里的 maxAge 选项似乎不起作用。所以我重写会话配置代码如下。

      var MongoStore = require('connect-mongo')(express);
      app.use(express.session({
          秘密:“基本服务器”,
          曲奇饼 : {
              maxAge : 20000 //20 秒
          },
          //maxAge: new Date(Date.now() + 20000),
          商店:新的MongoStore({
              主机:'本地主机',
              端口:27017,
              数据库:'你的数据库',
              集合:'会话',
              字符串化:假,
              clear_interval : (10)//搜索db每10秒清除一次过期
          })
      }));
      

      代码运行良好。

      【讨论】:

        【解决方案4】:

        使用 Passport 进行身份验证

        var express = require('express'),
        routes = require('./routes'),
        api = require('./routes/api'),
        http = require('http'),
        path = require('path'),
        mysql = require('mysql'),
        passport = require('passport'),
        LocalStrategy = require('passport-local').Strategy;
        
        //MySQL
        
        var sqlInfo = {
            host: 'localhost', 
            user: 'root',
            password: '', 
            database: 'dbname'
        }
        
        
        global.client = mysql.createConnection(sqlInfo);
        
        client.connect();
        
        
        
        
        var app = module.exports = express();
        
        
        
        
        /**
         * Configuration
         */
        
        // all environments
        app.set('port', process.env.PORT || 3000);
        app.set('views', __dirname + '/views');
        app.set('view engine', 'jade');
        app.use(express.logger('dev'));
        app.use(express.bodyParser());
        app.use(express.methodOverride());
        app.use(express.static(path.join(__dirname, 'public')));
        
        app.use(express.cookieParser("secret"));
        app.use(express.session({
            secret: 'keyboard cat'
        }));
        app.use(passport.initialize());
        app.use(passport.session());
        
        app.use(app.router);
        
        
        
        
        passport.use(new LocalStrategy(
        
            function(username, password, done) {
        
                return check_auth_user(username,password,done);
        
            }
        
            ));
        
        
        // development only
        if (app.get('env') === 'development') {
            app.use(express.errorHandler());
        }
        
        // production only
        if (app.get('env') === 'production') {
        // TODO
        }
        
        
        
        /**
         * routes start---------------------------------------------------------------
         */
        // home page contain login form 
        app.get('/home', function(reg, res){
            //check user session value, is logged in 
            if(req.user)
                res.render('dash',{
                    username: req.user['member_id']//req.user array contains serializeUser data
                });
            else
                res.render('index');
        
        });
        
        app.get('/logout', function(req, res){
        
            req.logout();
            res.redirect('/home');
        });
        
        //login form submit as post
        
        app.post('/login',
            passport.authenticate('local', {
                successRedirect: '/dashboard',
                failureRedirect: '/home'
            })
            );
        //to project dashboard
        app.get('/dash',routes.dash);
        //to project dashboard
        app.get('/signup',routes.signup);
        //to project dashboard
        
        app.get('*', routes.index);
        
        /**
         * routes end---------------------------------------------------------------------
         */
        
        
        /**
         * Start Server
         */
        
        http.createServer(app).listen(app.get('port'), function () {
            console.log('Express server listening on port ' + app.get('port'));
        });
        

        click for more details with example

        【讨论】:

          猜你喜欢
          • 2017-08-05
          • 2021-10-20
          • 2012-05-01
          • 2012-06-09
          • 1970-01-01
          • 1970-01-01
          • 2015-06-29
          • 1970-01-01
          • 2013-06-20
          相关资源
          最近更新 更多