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

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

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

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

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


person desmondlee    schedule 12.02.2016    source источник


Ответы (2)


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

Короче

Сериализованный пользовательский объект хранится в 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 вопрос).

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

См. Мой ответ на этот вопрос, где я упоминал о доступе к статическому контенту, а также о том, как выборочно применять 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.

person Raf    schedule 12.02.2016

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

Если вы используете экспресс-сеанс с MemoryStore, данные будут сохранены в памяти узла процесс, индексированный по идентификатору сеанса. Здесь можно найти инициализацию магазина и здесь хранение данных.

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

person bolav    schedule 12.02.2016