Паспорт + Node.js/Автоматический вход после добавления пользователя
Я использую паспорт для проверки подлинности и сеанса. Пока все работает нормально. Я внедрил форму "Войти", чтобы добавить новых пользователей в приложение. После того, как пользователь добавлен, я хотел бы автоматически его входить в систему.
Каков наилучший способ добиться этого - следует ли перенаправить на "/login" с учетными данными пользователя или есть ли другой способ (вызвать serializeUser) для этого?
До сих пор я думаю, что я действительно не понимал, как работает "сделанная" функция (в serializeUser и LocalStrategy) или что она делает...
Вот мой код:
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
authProvider.findUserById('users', id, function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy( function(email, password, done) {
authProvider.getUserByEmail('users', email, function(error, user){
if(error) { return done(error); }
if (!user) { return done(null, false, { message: 'Unknown user ' + email });}
if (user.password != password) { return done(null, false);}
return done(null, user);
});
}
));
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login'}),
function(req, res) { res.redirect('/');});
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect('/sign');
} else {
res.redirect('/');
}
});
});
Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Пожалуйста, используйте код ниже @Weston, потому что он более универсальный и простой
Должен выглядеть примерно так.
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect('/sign');
} else {
passport.authenticate('local')(req, res, function () {
res.redirect('/account');
})
}
});
});
Я не уверен в названии стратегии, но по умолчанию LocalStrategy должен предоставить "локальное" имя
http://passportjs.org/guide/authenticate/
Ответ 2
На основании Руководства по паспорту req.login()
предназначен именно для этой цели.
Эта функция в основном используется при регистрации пользователей, во время которой req.login()
может быть вызван для автоматического входа в систему только что зарегистрированного пользователя.
Модификация кода Красу:
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if ( error ){
res.redirect('/sign');
} else {
req.login(user, function (err) {
if ( ! err ){
res.redirect('/account');
} else {
//handle error
}
})
}
});
});
Потенциальная ошибка от обратного вызова login()
будет исходить от вашей функции serializeUser()
.
Ответ 3
Попробуйте:
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
passport.authenticate('local', (err, user) => {
req.logIn(user, (errLogIn) => {
if (errLogIn) {
return next(errLogIn);
}
return res.redirect('/account');
});
})(req, res, next);
});
});