2013-05-29 5 views
23

Я использую паспорт для проверки подлинности и сеанса. Пока все работает нормально. Я внедрил форму «Войти», чтобы добавить новых пользователей в приложение. После того, как пользователь добавлен, я хотел бы автоматически его входить в систему.Паспорт + 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('/'); 
     } 
    }); 
}); 

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

+0

Почему бы доступ функция десериализации DB? Не может он просто вернуться (null, id); ? – Se7enDays

ответ

10

Пожалуйста, используйте код из the @Weston answer bellow, потому что это более универсальный и простой

должен выглядеть как этот

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/

+0

Спасибо за ваш ответ, но он не работает. Я получаю «Несанкционированный». – user937284

+1

Вот рабочий пример - https://gist.github.com/krasu/5688235, убедитесь, что ваши имена полей в форме регистра совпадают с формой входа – krasu

+0

. В поле электронной почты должно быть указано имя пользователя - вот и все. Благодаря! – user937284

32

На основании Passport Guidereq.login() предназначенный для этой целевой цели.

Эта функция используется в первую очередь, когда пользователи регистрируются, в течение которых может быть вызван req.login(), чтобы автоматически регистрировать зарегистрированного пользователя. Код

модифицирующих Krāsu в:

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() функции.

+1

Согласно вашей ссылке, имя метода - 'login', а не' logIn'. – fiddur

+2

'logIn' был старым API, по-прежнему является общепринятым псевдонимом и следует за конвенцией библиотеки на корпусе верблюда (в зависимости от того, вы видите вход в систему как одно или два слова). Вы более чем можете обновить ответ для нового API с хорошим сводкой редактирования, особенно учитывая возраст ответа. – Weston

+0

А что, если я прямо вхожу в систему? Мне явно нужно вызвать функцию req.login? –

1

Try с:

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); 
    }); 
}); 
+1

Да, я буквально потратил много времени, чтобы выяснить, что было неправильно, когда я замечаю из вашего кода, что я забыл передать '(req, res, next)' to 'passport.authenticate()'. –

Смежные вопросы