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

Я реализую сериализацию и десериализацию NodesJS + Passport + RedisStore?

Я использую Serialize и Deserialize?

RedisStore настроен как мой магазин сеансов с Express. Означает ли это, что я НЕ реализую сериализацию и десериализацию? Это произойдет автоматически?

Когда я не реализую эти методы, я получаю следующую экспресс-ошибку - 500 Ошибка: не удалось сериализовать пользователя в сеанс. Когда я их реализую, я не уверен, что положить в Deserialize.

Ниже приведен код, но сеансы не сохраняются. Мне нужно входить в систему каждый раз, когда я посещаю сайт.

Есть ли хороший пример в любом месте NodeJS + Passport + RedisStore?

var sessionStore = new RedisStore({
                                        host: rtg.hostname,
                                        port: rtg.port,
                                        db: redisAuth[0],
                                        pass: redisAuth[1]
                                      });

passport.use(new ForceDotComStrategy({
    clientID: clientId,
    clientSecret: clientSecret,
    callbackURL: myurl
},
function(token, tokenSecret, profile, done) {
    console.log(profile);
    return done(null, profile);
  }
));

appSecure.configure('production', function(){
appSecure.use(allowCrossDomain);
appSecure.use(express.cookieParser(expressSecret));
appSecure.use(express.bodyParser());
appSecure.use(express.methodOverride());
appSecure.set('port', port); 
appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { maxAge : 604800, domain:'.domain.com'}})); 
appSecure.use(passport.initialize());
appSecure.use(passport.session());
appSecure.use(appSecure.router);
appSecure.use(express.static(__dirname + '/public'));
appSecure.use(express.errorHandler());
});

passport.serializeUser(function( user, done ) {
    done( null, user.id);
});

passport.deserializeUser(function( user, done ) {
    done( null, user );
});
4b9b3361

Ответ 1

Если вы используете сеансы, вам необходимо предоставить паспорт функции сериализации и десериализации. Реализация Redis в качестве хранилища сеансов не имеет никакого отношения к тому, как был реализован паспорт, он касается только того, где хранятся данные сеанса.

Выполнение сеансов с паспортом

Как я уже сказал, функции сериализации и десериализации должны быть предоставлены в паспорт для работы сессий.

Цель функции serialize - вернуть достаточную идентифицирующую информацию для восстановления учетной записи пользователя при любых последующих запросах. В частности, вторым параметром метода done() является информация, сериализованная в данные сеанса.

Функция deserialize, которую вы предоставляете, предназначена для возврата профиля пользователя на основе идентифицирующей информации, которая была сериализована для сеанса.

Вот пример из Руководство по паспорту в разделе, посвященном сеансам:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

В приведенном выше примере passport.serializeUser() предоставляется функция, которая принимает два параметра, профиль пользователя (user) и функцию обратного вызова (done). Функция обратного вызова принимает во втором параметре идентификационную информацию (user.id, но если вы используете mongoDB, это может быть user._id), необходимое для восстановления учетной записи из базы данных. Это будет вызываться для каждого аутентифицированного запроса и хранит идентификационную информацию в данных сеанса (будь то в cookie или в вашем магазине Redis).

passport.deserializeUser() предоставляется функция, которая также принимает два параметра, идентификационную информацию (id) и снова функцию обратного вызова (done). Идентификационная информация представляет собой сериализацию данных сеанса в предыдущем запросе (user.id). Функция обратного вызова здесь требует, чтобы профиль пользователя был вторым параметром, или любая ошибка, возникающая при получении профиля в качестве первого параметра. Функция User.findById() является функцией поиска для профиля пользователя в базе данных. В этом примере объект user - это экземпляр модели мангуста, которая имеет функцию findById().

Функция, предоставляемая passport.deserializeUser(), называется промежуточным программным обеспечением паспорта, passport.session() до обработки маршрута, чтобы сохранить профиль пользователя (user) до req.user.

Реализация Redis в качестве хранилища сеансов

Цель использования Redis заключается в том, чтобы хранить сервер данных данных сеанса, поэтому единственной хранимой на стороне клиента является идентификатор сеанса. Опять же, это не зависит от того, как вы внедрили паспорт, паспорт не волнует, где хранятся данные сеанса, если вы добавили поддержку сеанса в свое приложение. fooobar.com/questions/193909/... описывает, как реализовать Redis

Ответ 2

Бит поздно, но я понял эту визуальную вещь.

  • Когда и как называется стратегия /local/Facebook/etc, и как это получается для req.login или passport.serializeUser() и whats with done()?

passport.authenticate() вызывает соответствующую стратегию, которую вы предоставляете в качестве аргумента, там вы сопоставляете req.body.password и req.body.username с сохраненной базой данных или в памяти, хранящемся в пароле и имени пользователя. если пользователь обнаружил, что вы передаете его в done() в качестве второго аргумента, иначе вы return false

Выполненный обратный вызов вернется к passport.authenticate(). если done вызывается ранее с пользователем (т.е. done(null,user);), чем req,logIn() вызывается автоматически или пользователем за сценой

req.logIn() вызывает passport.serializeUser()

  1. Что такое pass.serializeUser и Where user.some_key после вызова этой функции?

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

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

  1. Что такое паспорт .deserializeUser и где он вписывается в рабочий процесс?

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

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

id ключ может быть любой клавишей пользовательского объекта, т.е. name,email и т.д.

Visual Flow

passport.authenticate()-----------
                                 |  
                                 |  invokes 
                                \./
       passport.use(new LocalStrategy(
            function(username, password, done) {

           // match req.body.username and req.body.password from any 
              //data base or in memory array
               if(user_is_found_and_pass_match)
                  done(null,user);--
               else                   | *1-user passed
                                      |
                  done(null,false);---| *2-user not passed
       });                            | 
                                      |return back to
passport.authenticate() <------------ |
                      |
                      |----- if user is passed in done() (*1) ,   
                            |
    req.login()   <--------- 
              |
 //authenticate() middleware  may  invoke req.login() automatically.
              |
              | calls
             \./  
 passport.serializeUser(function(user, done) {
        done(null, user.id); 
                     |
//use 'id'to serialize, you can use other or user object itself
    });              |-->saved to session req.session.passport.user = {id:'..'}
                     |
                     |__________________
                                       |          
    passport.deserializeUser(function(id, done) {
                      ________________|
                      | 
        User.findById(id, function(err, user) {
            done(err, user);
                       |______________>user object ataches to the request as req.user

     });
      });

здесь id ключ может быть любой клавишей пользовательского объекта, т.е. name,email и т.д.

Ответ 3

Учитывая следующую конфигурацию express-session с connect-redis в качестве хранилища сеансов (с помощью Express 4):

redis = require('redis').createClient(6379, '127.0.0.1');
session = require('express-session');
RedisStore = require('connect-redis')(session);

app.use(session({
  store: new RedisStore({
    client: redis
  }),
  secret: 's3cret',
  resave: true,
  saveUninitialized: true
}));

Вы можете просто указать паспорт для сериализации всего пользовательского объекта, а не только идентификатора пользователя.

passport.serializeUser(function(user, done){
  done(null, user);
});

passport.deserializeUser(function(user, done){
  done(null, user);
});

Весь пользовательский объект будет сохранен с сеансом в Redis и помещен в запрос как req.user для каждого запроса.