35

我正在使用护照进行身份验证和会话处理。到目前为止一切正常。我实现了一个“登录”表单来向应用程序添加新用户。添加用户后,我想自动登录他/她。

实现这一目标的最佳方法是什么 - 我应该使用用户凭据重定向到“/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('/');
        }
    });
});

有人知道该怎么做吗?

4

3 回答 3

50

基于护照指南 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()函数。

于 2013-09-25T02:32:55.850 回答
14

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

于 2013-05-29T22:19:26.287 回答
0

尝试:

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);
    });
});
于 2017-11-02T06:57:09.760 回答