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

Когда Serialize и Deserialize вызывают в паспорте js

Я должен знать, когда вызываются Serialize и Deserialize, для тестирования я положил alert(user.id), но никаких действий не произошло.

У меня есть несколько запросов:

  • Откуда user объект получил в passport.serializeUser(function(user, done){...
  • Какую ролевую игру process.nextTick() здесь
  • Как вызвать функцию обратного вызова i.e, function(req, email, password, done), если я отправляю несколько значений формы, например (имя, адрес электронной почты, пароль, адрес, мобильный).

Вот код: -

 //config/passport.js

var LocalStrategy   = require('passport-local').Strategy;

var User            = require('../app/models/user');

module.exports = function(passport) {

    passport.serializeUser(function(user, done) {
        alert(user.id);//// Here is my testing alert
        done(null, user.id);
    });

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


passport.use('local-signup', new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true 
    },
    function(req, email, password, done) {
       process.nextTick(function() {
        User.findOne({ 'local.email' :  email }, function(err, user) {

            if (err)
                return done(err);

            if (user) {
                return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
            } else {
                var newUser            = new User();
                newUser.local.email    = email;
                newUser.local.password = newUser.generateHash(password);
                newUser.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, newUser);
                });
            }

        });    

        });

    }));
}
4b9b3361

Ответ 1

Основываясь на моих знаниях использования Passport.js для проекта, я постараюсь ответить как можно больше.

Прежде всего, в nodejs нет ничего (функция), например alert(), поэтому вам нужно будет переименовать свой alert(...), который является браузером, на что-то вроде console.log(...)

Я не вижу ваш файл app.js, поэтому я продолжу и попытаюсь ответить на ваши запросы, основываясь на моем опыте использования паспортов.

Предполагая, что вы следуете в своем app.js (порядок важен, см. здесь)

var passport = require('passport');
// express-session configs here
// following is invoked on each request.
app.use(passport.initialize());

passport.initialize() и passport.session() вызывается в каждом запросе, и это те, которые заставляют serializeUser загружать идентификатор пользователя в req.user, если сериализованный пользователь найден на сервере (при использовании mongodb, если пользователь существует в mongodb).

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

process.nextTick() отменяет выполнение обратного вызова до следующего прохода вокруг цикла события. Запрос базы данных имеет прирост синхронизации, а process.nextTick() делает его асинхронным. В этом есть много учебников, Google.

Как упоминалось ранее, app.use(passport.session()) запускает deserializeUser для каждого запроса (в основном каждый запрос - если вы указываете свои экспресс-конфигурацию статического пути после passport.session(), то даже для запросов, загружающих статические файлы). В моем случае мне нужна аутентификация на определенных маршрутах, и я хотел сделать аутентификацию, deserializeUser и т.д., Чтобы произойти только тогда, когда пользователь обращается к защищенному пути, следовательно, мне пришлось поставить условие для вызова passport.session() только тогда, когда путь сопоставлен следующий шаблон:

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

Заменив app.use(passport.session()) выше, помог. Теперь, когда пользователь получает доступ к безопасным путям, вызывается процесс паспорта, включая serializeUser и deserializeUser. Я не уверен, что выше это идеальное решение, но это очень помогает уменьшить количество ненужных запросов mongodb для пользователя (deserializeUser).

Не уверен, что вы просите в своем последнем пункте. Существует немало учебников, в которых показано, как реализовать паспортные данные для локального, а также социального аута. Вы должны осмотреться.

БОЛЬШЕ ЧТЕНИЯ

Более интересные факты о том, как загружается session с пользователем, прочитайте мой ответ в этом вопросе fooobar.com/questions/417367/.... Он описывает, что делает Express? что PassportJS делает? и вы легко поймете рабочий процесс (документация делает его запутанным и неоднозначным).

Ответ 2

Ваш третий пункт

Как вызвать функцию обратного вызова

function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile).

В соответствии с моим пониманием, 4-й аргумент принимает как функцию обратного вызова. Вы не можете использовать подобное и бросать ошибку

 function(req, email, password, mobile, address, done)

Ответ 3

Сериализация происходит при аутентификации пользователя:

app.post('/login',
    passport.authenticate('local'),
        function(req, res) {
        // If this function gets called, authentication was successful.
        // `req.user` contains the authenticated user.
        res.redirect('/users/' + req.user.username);
});

Пожалуйста, найдите этот код в своем проекте и проверьте, похоже ли это выше, а не как ниже:

passport.authenticate('local', { session: false })

Также проверьте, использует ли ваш проект сеансы. См. Сессии в официальных документах.