Обновить или добавить поля в 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()
на каждом.
Надеюсь, поможет.