2016-02-12 10 views
13

Я использую узел/экспресс с паспортом в своем развитии. Я наткнулся на статью, в которой говорится:Как паспорт js хранит пользовательский объект в сеансе?

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

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

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

ответ

19

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

в коротких

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

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

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

Express несет ответственность за создание сеанса. Когда создаются сеансы? То есть, когда Express не обнаруживает cookie сеанса. Таким образом, порядок, в котором вы упорядочиваете свои и passport конфигурациях в файле app или server.js, очень важен. Если вы объявите свои и 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 
}); 

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

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^