Passport + Node.js /添加用户后自动login

我正在使用护照进行身份validation和会话处理。 一切工作到目前为止。 我实施了“login”表单来向应用添加新用户。 添加用户后,我想自动login他/她。

什么是最好的方式来实现这个 – 我应该redirect到“/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('/'); } }); }); 

有人知道如何做到这一点?

       

网上收集的解决方案 "Passport + Node.js /添加用户后自动login"

请使用@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/

根据护照指南 req.login()是为了这个确切的目的。

此function主要用于用户注册,在此期间可以调用req.login()来自动login新注册的用户。

修改krasu的代码:

 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()callback的潜在错误来自serializeUser()函数。

试试:

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