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

Паспорт + 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('/');
        }
    });
});

Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 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);
    });
});