Node.js Expiration du cookie passeport express

Je suis en utilisant le Passeport pour l'authentification dans mon application, et je suis également en utilisant Express. Pour résumer mon problème: mon la fonctionnalité de login fonctionne bien au début, mais après tout session de l'utilisateur en temps, pas les utilisateurs sont en mesure de se connecter.

Je suis en utilisant le standard de la stratégie Locale pour l'authentification.

Je vais inclure nu comme un exemple possible, en se basant sur ma configuration:

//-------------
//Set up authentication with Passport
//-------------
var userModel = require('./models/user')(db);
passport.use(new LocalStrategy(
function(username, password, done) {
var errorMessage = 'Incorrect username/password combination.';
userModel.GetUserByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: errorMessage });
}
user.validatePassword(password, function(isPasswordCorrect) {
if (!isPasswordCorrect)
{
return done(null, false, { message: errorMessage });
}
//Update with login date
userModel.UpdateUserWithLogin(username, user.currentLoginTime, function(err){
//if we have an error here, we should probably just log it
if(err)
{
console.log(err);
}
});
return done(null, user);
});
});
}
));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
userModel.GetUserByUsername(user._id, function(err, user) {
done(err, user);
});
});
//-------------
//Set up express and configure
//-------------
var sessionStore = new SkinStore(db);
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.engine('html', consolidate.swig);
app.set('view engine', 'html');
swig.init({
root: '.',
allowErrors: true, //allows errors to be thrown and caught by express instead of suppressed
autoescape: false});
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser("[mysecrethere]"));
app.use(express.session({   store: sessionStore,
cookie: { expires : new Date(Date.now() + 3600000) } //1 Hour
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(expressValidator);
app.use(express.static(path.join(__dirname, 'public')));
//Dynamic helpers
app.use(require('./helpers/DynamicHelpers'));
app.use(app.router);
});
app.get('/login', routes.login);
app.post('/login', passport.authenticate('local', {failureRedirect: '/login',
badRequestMessage: "Please enter username and password",
failureFlash: true }),
function(req, res) {
var targetUrl = req.session.pageAfterLogin;
delete req.session.pageAfterLogin;
res.redirect(targetUrl || '/account');
});
app.get('/account', IsAuthenticated, routes.account.show);

Et la IsAuthenticated fonction d'assistance:

function IsAuthenticated(req,res,next){
if(req.isAuthenticated())
{
next();
}
else
{
//save the requested page and then redirected
req.session.pageAfterLogin = req.url;
req.flash("error", "You must be logged in first!");
res.redirect('/login');
}
}

Ce que je peux trouver par le débogage est que, une fois l'authentification réussie (et après un témoin a expiré), j'ai frappé cette logique (à partir de ci-dessus):

function(req, res) {
var targetUrl = req.session.pageAfterLogin;
delete req.session.pageAfterLogin;
res.redirect(targetUrl || '/account');
}

Où je peux voir que le "req" a la session de définir correctement, avec Passeport informations stockées correctement. Ensuite, la redirection se produit, le nouveau demande n'a pas de session de l'information stockée, et dispose d'un tout nouveau ID de Session. Je me doutais bien qu'aucun témoin n'a été mis sur le client, et qui ne semble pas être le cas, ce qui doit expliquer le manque de cohérence dans les sessions.

Cependant, je ne peux pas comprendre pourquoi aucun nouveau cookie est fixé. Est-il quelque chose de mal avec la façon dont l'application est configuré qui pourrait indiquer pourquoi ce qui se passe?

Je dois ajouter que le redémarrage de l'Node.js exemple résout le problème, c'est pas juste quelque chose qui serait tolérable dans la production.

Grâce.

Mise à JOUR: j'ai couru un violon pour voir ce qui se passait avec HTTP/S de trafic, et je peux voir que quand il travaille d'abord, je suis un cookie défini dans le navigateur (j'en ai essayé plusieurs) qui est ensuite transmise au serveur sur les demandes ultérieures.

Quand il n'est pas travail, le navigateur n'est pas en passant des cookies pour le serveur, et donc le Nœud de l'envoi d'une-tête Set-Cookie qui fournit un nouveau cookie à chaque fois. Jusqu'à présent, je n'ai pas eu la chance de pouvoir déterminer la cause de cette.

source d'informationauteur creativename