Обновить или добавить поля в passport.js локальной стратегии?

Я во всех документах, но я не могу найти способ обновить учетные данные.

Это то, что я смог понять, проанализировав код.

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

DeserializeUser кажется полезным, но я не уверен, как использовать его для обновления или добавления полей?

Я пытался взломать и скопировать логику из логина и разобраться в этом.

passport.use('local-update', new LocalStrategy({
    usernameField : 'username',
    passReqToCallback : true
},
function(req, username, done) {

    console.log(req)
    // asynchronous
    // AppUser.findOne wont fire unless data is sent back
    // process.nextTick(function() {

    //     // find a user whose email is the same as the forms email
    //     // we are checking to see if the user trying to login already exists
    //     AppUser.findOne({ 'local.email' :  email }, function(err, user) {
    //         // if there are any errors, return the error
    //         if (err)
    //             return done(err);

    //         // check to see if theres already a user with that email
    //         if (!user) {
    //             //return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
    //             return done(null, false);
    //         } else {

    //             // if there is a user with that email
    //             // create the username
    //             var updateUser = new AppUser();

    //             // set the user's local credentials
    //             newUser.local.email    = email;
    //             newUser.local.password = newUser.generateHash(password);

    //             // save the user
    //             newUser.update(function(err) {
    //                 if (err)
    //                     throw err;
    //                 return done(null, newUser);
    //             });
    //         }

    //     });    

    // });

}));

Затем в форме отправки я сделал это.

app.post('/profile', passport.authenticate('local-update', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/signup' // redirect back to the signup page if there is an error
    //failureFlash : true // allow flash messages
}));

Это приводит к ошибке перенаправления.

Это не работает, потому что нет ответа, но мне нужно найти модель в mongoDB. Сначала я пытаюсь увидеть req в консоли, так что, возможно, я смогу увидеть, как найти модель, но ничего не появляется.

Очевидно, ХАКИШ-код выше, но это лучшее, что я мог сделать. Мне нужен конкретный ответ, я уверен, что он прост, и мне не хватает его в документах!

Изменить: Идея здесь заключается в том, когда пользователь регистрируется / входит в систему, они предоставляют электронную почту. Как только пользователь вошел в систему и создал учетную запись, он может создать имя пользователя.

Изменить: Таким образом, я не могу понять, как сделать запросы на обновление с паспортом, но в моем маршрутизаторе у меня есть что-то вроде этого.

app.post('/', function(req, res) {
    if (req.user) {
        AppUser.findOne({ _id: req.user.id }, function (err, user) {
            user.local.username  = req.body.username;
            user.save(function(err) {
                if (err){
                    console.log('Error')
                } else {
                    console.log('Sucess')
                }
            });
        });
    }
});

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

Но я мог бы просто добавить эту логику в мой код на стороне клиента и добавить метод POST в магистраль, и это должно работать!

1 ответ

В таких случаях вы можете добавить callback array в качестве аргумента для экспресс-маршрута.

Я думаю, вы можете изменить ваш обработчик проверки на что-то вроде:

function(req, username, done) {
    //perform here only the validations you need to let the login pass
    if (validationSuccess) {
        done();
    } else {
    done('an error occured');
    }
}

Итак, предположив, что эта функция успешно проверит учетные данные пользователя, вы можете написать еще одну:

function doSomethingAfter(req, res, next) {
    //do anything else you need here
    //e.g.
    SomeModel.create(req.body.username);
    //the response is available here
    res.send('Everything ok');
}

Наконец, вы можете редактировать свою функцию маршрутизации

app.post('/profile', [passport.authenticate('local-update', {
    failureRedirect : '/signup' // redirect back to the signup page if there is an error
}), doSomethingAfter]);

Таким образом, вы можете выполнить аутентификацию и сделать все, что захотите после того, как запрос будет аутентифицирован. Если вам нужно добавить больше функций, вы должны добавить их в массив и вызвать next() на каждом.

Надеюсь, поможет.

Другие вопросы по тегам