Подтвердить что ты не робот

Как паспорт js хранит пользовательский объект в сеансе?

Я использую node/express с паспортом в своем развитии. Я наткнулся на статью, в которой говорится:

Экспресс загружает данные сеанса и привязывает его к req. Поскольку паспорт хранит сериализованного пользователя в сеансе, сериализованный пользовательский объект можно найти по адресу req.session.passport.user.

Но, к моему удивлению, значение для хранилищ sessionID в cookie браузера остается прежним до и после входа в систему. Итак, где хранится сериализованный пользовательский объект?

Я думал, что он был сначала сохранен в пользовательском cookie sessionid cookie, но кажется, что это не так, поскольку я все еще могу получить доступ к моему пользовательскому объекту с помощью req.session.passport.user

4b9b3361

Ответ 1

Итак, где хранится сериализованный пользовательский объект?

Короче

Сериализованный пользовательский объект хранится в req.user на PassportJS, взятом из req.session.passport.user (который заполняется Express) с помощью метода Passport's deserializeUser.

Express добавляет идентификатор объекта сеанса в файл cookie в браузере пользователя, который отправляется обратно, чтобы выразить в заголовке по каждому запросу. Express затем берет идентификатор из заголовка и ищет хранилище сеансов (т.е. Mongo или что-то еще) и находит запись и загружает ее в req.session.

PassportJS использует содержимое req.session для отслеживания аутентифицированного пользователя с помощью методов serializeUser и deserializeUser (для получения дополнительной информации о рабочем процессе serializeUser и deserializeUser см. мой ответ в это SO question).

Express отвечает за создание сеанса. когда создаются сеансы? То есть, когда Express не обнаруживает cookie сеанса. Поэтому порядок, в котором вы упорядочиваете конфигурации session и passport в файле app или server.js, очень важен. Если вы объявляете свои конфигурации session и passport выше static directory configs, тогда все запросы для static content также получат сеанс, что не очень хорошо.

См. мой ответ на этот SO question, где я упомянул о статическом доступе к содержимому, а также о том, как выборочно применять passport к определенным маршрутам, чем по умолчанию (вам может не потребоваться аутентификация всех маршрутов, поэтому вы можете избежать ненужных session store lookup и de-serialization, добавив сеанс только к запросам, которые отображаются для защиты URL-адресов, см. ниже).

//selectively applying passport to only secure urls
app.use(function(req, res, next){
  if(req.url.match('/xxxx/secure'))
    passport.session()(req, res, next)
  else
    next(); // do not invoke passport
});

Существует один удивительный учебник, который я настоятельно рекомендую вам прочитать, если вы хотите понять рабочий процесс PassportJS.

Ответ 2

Вы можете посмотреть sessionID в файле cookie как ключ к базе данных, в которой хранятся данные сеанса. В зависимости от того, какой обработчик сеанса вы используете с выражением, и какую политику хранения вы используете, данные будут храниться по-разному. Это означает, что sessionID может быть одним и тем же значением до входа в систему, после успешного входа в систему и даже после выхода пользователя из системы.

Если вы используете express-session с MemoryStore, данные будут сохранены в памяти процесса node, проиндексированы на идентификатор сессии. Посмотрите здесь инициализацию в магазине и здесь для сохранение данные.

Вы можете создать хранилище, в котором данные будут сериализованы в файл cookie, но ни один из них не указан в совместимых сеансах хранения.