Понимание пассива сериализации десериализации

Как бы вы объяснили рабочий процесс сериализации и десериализации методов Passport для непрофессионала.

  • Где user.id идти после passport.serializeUser был вызван?

  • Мы вызываем passport.deserializeUser сразу после него, где он вписывается в рабочий процесс?

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id); 
       // where is this user.id going? Are we supposed to access this anywhere?
    });
    
    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
    

Я все еще пытаюсь обвести вокруг себя голову. У меня есть полное рабочее приложение, и я не запутался в каких-либо ошибках.

Я просто хотел понять, что именно происходит здесь?

Любая помощь приветствуется.

Ответ 1

  • Где пользователь user.id отправляется после получения паспорта .serializeUser?

Идентификатор пользователя (вы предоставляете в качестве второго аргумента функции done) сохраняется в сеансе и позже используется для извлечения всего объекта с помощью функции deserializeUser.

serializeUser определяет, какие данные пользовательского объекта должны храниться в сеансе. Результат метода serializeUser присоединяется к сеансу как req.session.passport.user = {}. Например, это будет (поскольку мы предоставляем идентификатор пользователя в качестве ключа) req.session.passport.user = {id:'xyz'}

  1. Мы вызываем pass.deserializeUser сразу после него, где он подходит для рабочего процесса?

Первый аргумент deserializeUser соответствует ключу пользовательского объекта, который был передан функции done (см. 1.). Таким образом, весь ваш объект извлекается с помощью этого ключа. Этот ключ здесь - идентификатор пользователя (ключ может быть любым ключом пользовательского объекта, то есть имени, электронной почты и т.д.). В deserializeUser этот ключ сопоставляется с массивом/базой данных в памяти или с любым ресурсом данных.

Приобретенный объект прикрепляется к объекту запроса как req.user

Visual Flow

passport.serializeUser(function(user, done) {
    done(null, user.id);
                 |
});              | 
                 |
                 |____________________> saved to session req.session.passport.user = {id:'..'}
                                   |
                                  \|/           
passport.deserializeUser(function(id, done) {
                   ________________|
                   |
                  \|/ 
    User.findById(id, function(err, user) {
        done(err, user);
                   |______________>user object attaches to the request as req.user

 });
  });

Ответ 2

Для всех, кто использует Koa и koa-passport:

Знайте, что ключ для пользователя, установленный в методе serializeUser (часто уникальный идентификатор для этого пользователя), будет храниться в:

this.session.passport.user

Когда вы устанавливаете в done(null, user) в deserializeUser, где "пользователь" - это некоторый пользовательский объект из вашей базы данных:

this.req.user ИЛИ this.passport.user

по какой-либо причине this.user Контекст Koa никогда не устанавливается, когда вы вызываете done (null, user) в вашем методе deserializeUser.

Итак, вы можете написать свое собственное промежуточное программное обеспечение после вызова app.use(passport.session()), чтобы поместить его в this.user следующим образом:

app.use(function * setUserInContext (next) {
  this.user = this.req.user
  yield next
})

Если вы не знаете, как работают serializeUser и deserializeUser, просто нажмите меня в твиттере. @yvanscher