Ho bisogno di una casella di controllo "Ricordami" quando effettui il login come this. E aggiungo un middleware prima di utilizzare il passaportoCome aggiungere "Ricordami" alla mia app con passaporto
app.use(function (req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = 1000 * 60 * 3;
} else {
req.session.cookie.expires = false;
}
}
next();
});
app.use(passport.initialize());
app.use(passport.session());
Non riesco ad accedere quando req.body.rememberme
è vero e l'utente si ricorda quando req.body.rememberme
è falso. Ho anche provato connect-ensure-login e ancora sbagliato.
e un'altra domanda: quando devo eliminare i cookie nel mio database e come?
:)
Altro codice è esattamente la stessa, come la guida del passaporto
percorso:
app.get('/', passport.authenticate('local', {failureRedirect: '/login'}), function (req, res) { res.redirect('/user/home'); });
app.post('/login', passport.authenticate('local', {failureRedirect: '/login'}), function (req, res) { res.redirect('/user/home'); });
sessioni:
passport.serializeUser(function(user, done) {
var CreateAccessToken = function() {
var token = user.GenerateSalt();
User.findOne({accessToken: token}, function(err, existingUser) {
if (err) return done(err);
if (existingUser) {
CreateAccessToken();
} else {
user.set('accessToken', token);
user.save(function(err) {
if (err) return done(err);
return done(null, user.get('accessToken'));
})
}
});
};
if (user._id)
CreateAccessToken();
});
passport.deserializeUser(function(token, done) {
User.findOne({accessToken: token}, function(err, user) {
if (err) return done(err);
return done(err, user);
});
});
e strategiche:
passport.use(new LocalStrategy(function(userId, password, done) {
User.findOne().or([{username: userId}, {email: userId}]).exec(function(err, user) {
if (err) return done(err);
if (!user) {
return done(null, false, {message: 'Invalid password or username'});
}
if (user.Authenticate(password)) {
return done(null, user);
} else {
return done(null, false, {message: 'Invalid password or username'});
}
});
}));
Ho notato che Express aggiornerà il cookie solo quando il valore hash è cambiato. così ho modificato il codice del middleware
app.use(function (req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = 1000 * 60 * 3;
req.session._garbage = Date();
req.session.touch();
} else {
req.session.cookie.expires = false;
}
}
next();
});
ora posso effettuare il login con "Remember Me", ma funziona solo su cromo e Firefox su Ubuntu. Non riesco ancora ad accedere con la casella di controllo "Remember Me" su Chrome e Firefox su Win7 e Android.
Ho verificato l'intestazione della risposta quando POST su "/ login" su chrome su win7 e aveva lo stesso campo "Set-Cookie" come su Ubuntu, perché non può funzionare?
Il tempo non è sincronizzato, quindi inserisco un campo di tempo extra.
$('#login').ajaxForm({beforeSubmit: function(arr, $form, option) {
arr.push({name: '__time', value: (new Date()).toGMTString()});
}});
e il middleware "RememberMe":
app.use(function (req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = moment(req.body.__time).add('m', 3) - moment();
req.session._garbage = Date();
req.session.touch();
} else {
req.session.cookie.expires = false;
}
}
next();
});
non è questo in modo errato? Se 'rememberme == true' significa che il cookie non dovrebbe scadere?Dovresti postare più codice in quanto ti serve più di questi tre middleware – pfried
Se 'rememberme == true' il cookie ottiene una scadenza (di 3 minuti in questo caso), altrimenti il cookie è fatto per essere un cookie di sessione (scadente quando il browser la sessione è terminata). Ma sono d'accordo: è necessario più codice. – robertklep
questo codice è molto confuso. Dovresti separare le preoccupazioni. Le funzioni 'serialize' e' deserialize' sono ony per ottenere un utente dal suo id (usa l'id del database) e serializzarlo su un cookie di sessione (l'id non sarà lì in chiaro se ti preoccupi). Non mescolare in qualche dubbio codice di sicurezza – pfried