2013-07-30 51 views
12

我试图在/register表单上提交POST后立即进行认证和登录用户。理想情况下,我希望用户能够注册,然后立即重定向到仪表板,而无需再次输入凭据。新用户注册后立即通过护照认证

我的服务器正在使用Passport 0.1.17,本地策略配置为使用电子邮件地址和密码进行登录。当前的代码是:

app.post('/register', function(req, res) { 

    // attach POST to new User variable 
    var registerUser = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 

    // save registerUser Mongo 
    registerUser.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('registerUser: ' + registerUser.email + " saved."); 
    } 
    }); 

    // here is where I am trying to authenticate and then redirect 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    res.redirect('/dashboard'); 
    }); 

我该如何重构此代码以保存新用户,然后进行身份验证并最终重定向到仪表板?

在此先感谢!

+2

使用'req.logIn'方法在注册后直接进行身份验证。 – moka

+0

感谢您引用'req.logIn',这是我以前不知道的。你能提供更具体的代码吗?我在上面的问题的最后一个注释之后尝试了以下内容,但它不起作用:'req.login(registerUser,function(err){if(err){return next(err);} return res.redirect '/ dashboard'); });' – surfearth

+0

您需要提供用于反序列化用户的详细信息,通常它是存储在会话中的用户的ID。 – moka

回答

19

这是我阅读req.login后想出了解决方案:

app.post('/register', function(req, res) { 
    // attach POST to user schema 
    var user = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 
    // save in Mongo 
    user.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('user: ' + user.email + " saved."); 
     req.login(user, function(err) { 
     if (err) { 
      console.log(err); 
     } 
     return res.redirect('/dashboard'); 
     }); 
    } 
    }); 
}); 

我想清理一下,觉得犯错部分可能会更强劲,但是这是一个有效的解决方案。请注意,其他人实现这一点,他们应该知道,它是适合使用护照本地策略与电子邮件,而不是用户名。

+1

来自新手的查询:这是否意味着您将用户的密码作为纯文本存储在数据库中?所以如果有人得到你的数据库,他们可以读取你的用户密码? –

+2

@Paul D. White:我知道这是陈旧的,但为了回答你的问题,为了未来的读者的利益,通常在用户模型类本身内处理加密,对于其他应用程序是透明的(这有利于使其不可避免)。 – Matt

+0

@Matt:不错,欢呼声欢呼。 –