我已经设置了一个有效的登录测试,如下所示:
var express = require('express');
var fs = require('fs');
var http = require('http');
var path = require('path');
var routes = require('./routes/index.coffee');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('./userdb.coffee');
var app = express();
var RedisStore = require('connect-redis')(express);
passport.use(new LocalStrategy(function(username, password, done) {
return User.findOne({
username: username
}, function(err, user) {
if (err) {
return done(null, false, message: error);
}
if (!user) {
return done(null, false, {
message: 'Unknown user'
});
}
if (!user.validPassword(password)) {
return done(null, false, {
message: 'Invalid password'
});
} else {
return done(null, user);
}
});
}));
passport.serializeUser(function(user, done) {
return done(null, user);
});
passport.deserializeUser(function(user, done) {
return done(null, user);
});
app.configure(function() {
app.set('port', process.env.PORT || 5003);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.enable('trust proxy');
app.use(express["static"](path.join(__dirname, 'public')));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('SOMESECRET'));
app.use(express.session({
cookie: {
maxAge: 10 * 60 * 1000
},
key: 'express.sid',
secret: 'SOMESECRET',
store: new RedisStore({
port: 6379,
host: 'localhost'
})
}));
app.use(passport.initialize());
app.use(passport.session());
return app.use(app.router);
});
var check_auth = function(req, res, next) {
if (req.isAuthenticated()) {
console.log(req.session.cookie.expires);
return next();
}
return res.redirect('/login');
};
app.get('/', check_auth, routes.index);
app.get('/login', routes.login);
app.get('/logout', routes.logout);
app.post('/authenticate', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
}));
app.listen(app.get('port'), '0.0.0.0');
路由和用户逻辑被省略,因为我认为它们与我的问题无关,但如果需要,我会很乐意分享它们(它们非常小,这只是为了获得一个小的概念证明并运行) .
登录工作,阅读会话工作,基于会话值呈现模板工作。 我的问题是 maxAge/expires。我不确定问题出在哪里,但我会尝试描述它:
当我登录时,会话保存passport.js
,正确存储在 myRedisStore
中,指向会话的 cookie 返回到浏览器。在后续请求中,cookie 被成功找到并指向来自 my 的正确会话SessionStore
。req.session.cookie
显示更新expires
,在我的redis
服务器中,TTL 重置为 10 分钟 (600)。
我的问题是 cookie 在浏览器(Chrome、Windows 和 Mac)中保持相同的过期时间。
所以我的问题是:如何进一步调试?随着 req.session 的更新(由express
和内部/自动),我想知道问题出在哪里,以及我应该做些什么来解决这个问题:passport
Cookie保持在初始 maxAges/expires。connect-redis
非常感谢任何提示、指示或想法。