Мне нужно установить флажок "Запомнить меня" при входе в систему, например . И я добавляю промежуточное программное обеспечение перед использованием паспорта
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());
Я не могу войти, когда req.body.rememberme
является истинным, и пользователь запоминается, когда req.body.rememberme
является ложным.
Я также попробовал connect-обеспечить-логин, и он все еще не прав.
и еще один вопрос: когда следует удалять файлы cookie в моей базе данных и как?
:)
Другой код в точности совпадает с паспортным справочником
Маршрут:
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'); });
сессий:
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);
});
});
и стратегия:
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'});
}
});
}));
Я заметил, что Express будет обновлять cookie только при изменении значения хэша. поэтому я изменил код в промежуточном программном обеспечении
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();
});
теперь я могу войти в систему с "Remember Me", но он работает только на Chrome и firefox на Ubuntu. Я до сих пор не могу войти с флажком "Запомнить меня" на Chrome и Firefox на Win7 и Android.
Я проверил заголовок ответа, когда POST на "/login" на chrome на win7, и у него было такое же поле "Set-Cookie", что и на Ubuntu, почему он не может работать?
Время не синхронизировано... поэтому я размещаю дополнительное поле времени.
$('#login').ajaxForm({beforeSubmit: function(arr, $form, option) {
arr.push({name: '__time', value: (new Date()).toGMTString()});
}});
и промежуточное ПО "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();
});