【问题标题】:Understanding done function in PassportJS了解 PassportJS 中的完成功能
【发布时间】:2016-02-23 20:31:49
【问题描述】:

我正在尝试实现一个正常的登录和注册模块,但我在理解 done 功能方面遇到了困难。here 是我认为负责 done 功能的行。现在我想做的是返回相应的消息,比如是否有一些服务器错误。

app.post('/user/auth/login', passport.authenticate('local-login'), function(req, res) {
    console.log("Login Request Successful");
    if(req.user){
        res.status(200).send(JSON.stringify({
            'msg' : "Successfully logged in"
        }));
    }
    else{
        res.status(400)
    }
    //console.log(req.user);
});

这适用于在登录 Passport 后将用户对象附加到请求模块的情况。 但是如何区分服务器错误和身份验证失败错误

这是我的身份验证中间件。

passport.use('local-login', new LocalStrategy({
    passReqToCallback: true
}, function(req, username, password, done) {

    Users.findOne({
        'emailId': username
    }, function(err, user) {
        if (err)
            return done(err);
        if (!user)
            return done(null, false);
        else if (passwordHash.verify(password, user.password)) {
            console.log("User is verified");
            req.session.save();
            return done(null, user);

        } else
            return done(null, false);
    });
}));

基本上,我需要访问 done() 函数中的消息。我怎么做?

如何运作,例如如果我输入了错误的密码,我在浏览器中收到未经授权的消息。这意味着它在某处将 response.data 字段设置为 Unauthorized。相反,我想知道何时出现错误并想发送我的自定义消息。

【问题讨论】:

    标签: node.js passport.js passport-local


    【解决方案1】:

    不知道是什么意思

    在 done() 函数中访问消息

    ,但是您可以很好地在 done 回调中为添加对象提供消息

    if (!user) {
        return done(null, false, {
                    message: 'Unknown user or invalid password'
        });
    }
    if (!user.authenticate(password)) {
        return done(null, false, {
                    message: 'Unknown user or invalid password'
        });
    }
    

    【讨论】:

    • 不知何故,在我的 response.data 中,消息字段不显示。有什么可能的原因吗?
    • 知道了... 用于显示提示用户重试的 Flash 消息。但我不希望它作为一条消息,我想将它显示为烤面包机通知。
    • 这完全是你的电话,你想如何显示消息:)
    【解决方案2】:

    另一种方法。 我不知道我是怎么错过的。文档中有一个自定义回调选项。这是相同的实现。

     app.post('/user/auth/login', function(req, res) {
            passport.authenticate('local-login', function(err, user, info) {
            if (err) {
                 res.status(500).send(JSON.stringify({
                    'msg': "Internal Server Error"
                }));
            }
            if (!user) {
               res.status(401).send(JSON.stringify({
                    'msg': "Username or Password is incorrect"
                }));
            }
            if (user) {
                res.status(200).send(JSON.stringify({
                    'msg': "Successfully logged in"
                }));
            }
        })(req, res, next);
        });
    

    此解决方案的唯一问题是您必须手动登录并创建会话等等。

    • 可以提供可选的callback 以允许应用程序覆盖默认的身份验证尝试方式 处理。回调具有以下签名,其中user 成功后将设置为经过身份验证的用户 身份验证尝试,否则false。可选info 参数将被传递,其中包含由 策略的验证回调。
    app.get('/protected', function(req, res, next) {
    passport.authenticate ('local',function(err, user, info) {
    if (err) { return next(err) } 
    if (!user) { return res.redirect('/signin') }
    res. redirect('/account');  
    })(req, res, next);
    });  
    

    请注意,如果提供了回调,则应用程序负责登录用户、建立会话等 执行所需的操作。

    【讨论】:

    • 很有趣,但是我试图以你第一次尝试的方式回答 :)
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多