首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js + express.js + passport.js :在服务器重新启动之间保持身份验证

Node.js + express.js + passport.js :在服务器重新启动之间保持身份验证
EN

Stack Overflow用户
提问于 2012-04-16 01:24:53
回答 7查看 41.5K关注 0票数 75

我使用passport.js在我的nodejs + express.js应用程序上处理身份验证。我设置了一个LocalStrategy从mongodb获取用户。

我的问题是,当我重新启动节点服务器时,用户必须重新进行身份验证。这是一个问题,因为我正在积极开发它,不想在每次重新启动时登录…(+ I使用节点管理程序)

下面是我的应用程序设置:

代码语言:javascript
复制
app.configure(function(){
    app.use('/static', express.static(__dirname + '/static'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({secret:'something'}));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

和会话序列化设置:

代码语言:javascript
复制
passport.serializeUser(function(user, done) {
    done(null, user.email);
});

passport.deserializeUser(function(email, done) {
    User.findOne({email:email}, function(err, user) {
        done(err, user);
    });
});

我使用connect-mongodb尝试了博客上给出的解决方案(删除了链接,因为它已经不存在了),但没有成功

代码语言:javascript
复制
app.use(express.session({
    secret:'something else',
    cookie: {maxAge: 60000 * 60 * 24 * 30}, // 30 days
        store: MongoDBStore({
        db: mongoose.connection.db
    })
}));

编辑附加问题:只能建立一个连接(使用一个connexion有限的mongohq免费服务)

EDIT 2解决方案(作为一个版本,我的声誉很低,到目前为止还不能回答我的问题

这是我最终找到的解决方案,使用mongoose发起的连接

代码语言:javascript
复制
app.use(express.session({
    secret:'awesome unicorns',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
        {db:mongoose.connection.db},
        function(err){
            console.log(err || 'connect-mongodb setup ok');
        })
}));
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-16 22:15:34

有一个名为的开源程序,它可以做您需要做的事情--将会话数据持久化到mongodb中

使用示例(重用mongoose打开的连接):

代码语言:javascript
复制
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sess');
app.use(express.session({
    secret:'secret',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
    // Following lines of code doesn't work
    // with the connect-mongo version 1.2.1(2016-06-20).
    //    {db:mongoose.connection.db},
    //    function(err){
    //        console.log(err || 'connect-mongodb setup ok');
    //   }
    {mongooseConnection:mongoose.connection}
    )        
}));

你可以在这里阅读更多信息:https://github.com/kcbanner/connect-mongo

票数 56
EN

Stack Overflow用户

发布于 2012-04-16 05:33:23

我像这样使用connect-mongo:

代码语言:javascript
复制
var MongoStore = require('connect-mongo');

var sess_conf = {
  db: {
    db: mydb,
    host: localhost,
    collection: 'usersessions' // optional, default: sessions
  },
  secret: 'ioudrhgowiehgio'
};

 app.use(express.session({
    secret: sess_conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(sess_conf.db)
  }));


[...]

// Initialize Passport!  Also use passport.session() middleware, to support
  // persistent login sessions (recommended).
  app.use(passport.initialize());
  app.use(passport.session());
票数 6
EN

Stack Overflow用户

发布于 2012-04-16 01:39:54

这是因为您对会话使用MemoryStore (默认)。看看来自memory.js (连接框架的一部分)的代码:

代码语言:javascript
复制
var MemoryStore = module.exports = function MemoryStore() {
  this.sessions = {};
};

这段代码来自session.js (速成版)

代码语言:javascript
复制
function session(options){
    /* some code */
    , store = options.store || new MemoryStore
    /* some code */
}

现在您应该明白了,每次服务器重新启动都会重置MemoryStore。为了保存数据,您必须使用其他会话存储。您甚至可以编写自己的(应该不会太难),尽管Redis (请参阅this library)可能是一个很好的选择(它得到了Express的很好支持)。

//编辑

根据the Connect documentation的说法,只要实现getsetdestroy方法就足够了。下面的代码应该可以工作:

代码语言:javascript
复制
customStore = {
    get : function(sid, callback) {
        // custom code, for example calling MongoDb
    },
    set : function(sid, session, callback) {
        // custom code
    },
    destroy : function(sid, callback) {
        // custom code
    }
}    

app.use(express.session({
    store: customStore
}));

您只需要实现调用MongoDb (或任何其他Db,尽管我仍然推荐使用非永久数据库,如Redis)来存储会话数据。也可以阅读其他实现的源代码来抓住这个想法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10164312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档