【问题标题】:Passport Sessions not getting destroyed on browser closePassport Sessions 不会在浏览器关闭时被破坏
【发布时间】:2015-01-07 03:18:44
【问题描述】:

我有一个 Node.js 服务器,我正在使用护照进行会话管理。计划很快使用它来实现服务器的记住我功能。但是我有一个问题,正常的会话基本上是在充当记住我的角色。也就是会话 cookie connect.sid 在浏览器关闭时不会被破坏,我认为这不是正确的行为。我使用 connect-bluesky 作为会话存储(使用 azure 表)和 couchbase 用于存储默认会话信息以供将来使用。

相关代码:

服务器.js

app.configure(function()
{
    app.use(express.logger('dev')); // log every request to the console
    
    // set up our express application
    app.use(express.cookieParser());
    app.use(express.json())
    .use(express.urlencoded());

    app.use(express.static(__dirname));

    var db = new couchbase.Connection({host: 'http://localhost:8091', bucket: 'default'}, function (err){
        
        console.log("In cb connect");
        console.log(err);

    });

    app.use(express.session({secret: 'SECRET', 
        store: new BlueskyStore({
          account: 'ACCOUNT',
          key: 'KEY',
          table: 'sessionsTable',
          cookie: { path: '/', httpOnly: true, maxAge: null }
        })
    }));

    app.engine('html', engines.ejs);
    //app.set('views', __dirname+'/views');
    app.set('view engine', 'html');

    var data = fs.readFileSync( __dirname+"/"+process.argv['2'],'utf8');
    GLOBAL.infoJSON = JSON.parse(data);
    
    require('./config/passport')(passport, infoJSON);
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash()); // use connect-flash for flash messages stored in session

    app.use(app.router);

});

Routes.js

function isLoggedIn(req, res, next) {

    
    if (req.isAuthenticated())
        return next();

    res.redirect('/');
}

app.post('/login2', passport.authenticate('local-login'),
  function(req, res) 
  {
    var input = "irrelevant input string";

    var loginInfo = {
        input : input,
        userName : req.user.id,
        repoId : req.user.repoId
    }

    edgeMod.loginWF(loginInfo, req, res, function (req, res, result)
    {
        res.write(result);
        res.end();
    });
});

app.get('/logout', function(req, res)
{
  req.logout();
  res.redirect('/');
});

passport.js

    passport.serializeUser(function(user, done) {

        db.set(user.id, user, function(err, result) {
            done(null, JSON.stringify(user));
        });
        
    });

    passport.deserializeUser(function(json, done) 
    {      
        var user = JSON.parse(json);        
        db.get(user.id, function(err, result) 
        {
            if (result)
            {
                
                done(null, result.value);
            }
            else
            {
                done(new Error("Bad JSON string in session"), null);
            }
        });
       
    });

  passport.use('local-login', new LocalStrategy({
        
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true 
    },
    function(req, email, password, done) 
    { 
        ---login checks---
        return done(null, serializeJson);
            
        });

    }));

如何确保会话在浏览器关闭时被销毁?作为我第一次做这样的事情,有什么建议吗?

编辑:它似乎正在清除 Firefox 中关闭的浏览器上的会话,但不是在 chrome 中。这可能与 chrome 在关闭时记住页面有关吗?

【问题讨论】:

  • cookie: { path: '/', httpOnly: true, maxAge: null } 应该是express.session 的一个选项,但你将它设置为BlueskyStore 的一个选项。
  • 我都试过了,但没有任何区别。它似乎也像我的问题一样在 Firefox 上工作,但不是在 chrome 上(启用从关闭继续。)

标签: node.js session azure couchbase passport.js


【解决方案1】:

在 chrome 选项中勾选“从上次中断的地方继续”似乎是问题所在。勾选后不会清除浏览器上的会话。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2020-04-29
    • 2020-11-06
    • 2018-01-05
    相关资源
    最近更新 更多