Сессия PassportJS
В нашем приложении ExpressJS, при нажатии на производственный сервер, сеанс паспорта в случайном порядке смешивается. Случайно страница может загружать представление другого пользователя, даже когда я не вышел из сеанса. Не делая ничего другого, другое обновление вернет меня к моей учетной записи (тоже случайно).
Это явление происходит с двумя нашими веб-приложениями, закодированными двумя отдельными пользователями, следуя инструкциям Passport на их веб-сайте. Оба веб-приложения используют Facebook connect/API.
Это происходит как в хранилищах сеансов Redis, так и в файлах. Я видел сообщение об использовании глобальных переменных: мы уверены, что мы используем только локальную область.
Есть ли что-то, что мы делаем неправильно?
Обновление v1
В одном приложении мы выполнили следующее для сериализации/десериализации для паспорта:
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
Другой, мы также попытались:
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
User
.where({id: user.id})
.fetch()
.then(function (user) {
done(null, user);
}, function (err) {
done(err, user);
});
});
В любом случае, у приложений все еще есть своя сессия.
Обновить v2
Эта ошибка возникает только при одновременном использовании нескольких пользователей на сервере и одновременном использовании. Это не происходит, если только 1 человек использует систему.
Обновить v3
Похоже, что проблема может быть вызвана Amazon AWS, поскольку некоторые из запросов страницы "неправильного пользователя" вообще не доходят до приложения NodeJS (проверено console.log
).
Ответы
Ответ 1
Проблема заключается в кэшировании, вызванном ExpressJS, а не сеансом PassportJS.
Мы выяснили, что ExpressJS устанавливает для параметра view cache
значение true в режиме prodution. Используя app.disable('view cache');
в app.js, мы отключили кеш и, похоже, решили проблему.