次のように、機能するログインテストを設定しました。
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
され、正しく保存さRedisStore
れ、セッションを指す Cookie がブラウザに返されます。後続のリクエストでは、Cookie が正常に検出され、 my からの正しいセッションを指していますSessionStore
。req.session.cookie
UPDATEDexpires
を表示し、私のredis
サーバーでは、TTL が 10 分 (600) にリセットされます。
私の問題は、Cookie がブラウザー (Chrome、Windows、および Mac) で同じ有効期限にとどまることです。
だから私の質問は:どうすればこれをさらにデバッグできますか? req.session が (によってexpress
、passport
およびconnect-redis
内部的に/自動的に) 更新されるので、問題がどこにあるのか、これを修正するにはどうすればよいのか疑問に思っています: Cookie は最初の maxAges/expires のままです。
ヒント、ポインタ、またはアイデアをいただければ幸いです。