我使用护照进行身份验证和会话处理。到目前为止一切正常。我实施了一个“登录”表单,以便向应用添加新用户。添加用户后,我想自动登录他/她。
实现这一目标的最佳方法是什么 - 我应该使用用户凭据重定向到“/ 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('/');
}
});
});
有人知道怎么做吗?
请使用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应提供“本地”名称
基于Passport Guide req.login()
的目的是为了这个目的。
此功能主要在用户注册时使用,在此期间可以调用
req.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()
回调的潜在错误将来自您的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);
});
});