在Passport.js身份验证失败时发回JSON响应

在Passport.js身份验证失败时发回JSON响应

对不起,我对node.js很新,所以我没有能够围绕这个问题。 我正在使用Node.js作为iPhone客户端的后端API服务器。 我使用Passport.js来验证本地策略。 相关代码如下:

// This is in user.js, my user model
UserSchema.static('authenticate', function(username, password, callback) {
    this.findOne({ username: username }, function(err, user) {
        if (err){
            console.log('findOne error occurred');
            return callback(err);
        }
        if (!user){
            return callback(null, false);
        }
        user.verifyPassword(password, function(err, passwordCorrect){
            if (err){
                console.log('verifyPassword error occurred');
                return callback(err);
            }
            if (!passwordCorrect){
                console.log('Wrong password');
                return callback(err, false);
            }
            console.log('User Found, returning user');
            return callback(null, user);
        });
    });
});

// This is in app.js
app.get('/loginfail', function(req, res){
    res.json(403, {message: 'Invalid username/password'});
});

app.post('/login',
    passport.authenticate('local', { failureRedirect: '/loginfail', failureFlash: false }),
    function(req, res) {
       res.redirect('/');
});

现在,我设法将失败的登录重定向到/ loginfail,在那里我将一些JSON发送到iPhone客户端。 但是,这并没有足够的粒度。 我想能够将相应的错误发回iPhone客户端,例如:“没有用户找到”或“密码错误”。 使用我现有的代码,我看不到如何完成。

我试图在passport.js网站上按照自定义回调的示例进行操作,但是由于缺乏节点的理解,我只是无法使其工作。 我如何修改我的代码,以便我能够用适当的错误代码/消息发回一个res.json?

编辑:我现在在尝试这样的事情:

// In app.js
app.post('/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return next(err) }
        if (!user) {
            console.log(info);
            // *** Display message without using flash option
            // re-render the login form with a message
            return res.redirect('/login');
        }
        console.log('got user');
        return res.json(200, {user_id: user._id});
    })(req, res, next);
});

// In user.js
UserSchema.static('authenticate', function(username, password, callback) {
    this.findOne({ username: username }, function(err, user) {
        if (err){
            console.log('findOne error occurred');
            return callback(err);
        }
        if (!user){
            return callback(null, false);
        }
        user.verifyPassword(password, function(err, passwordCorrect){
            if (err){
                return callback(err);
            }
            if (!passwordCorrect){
                return callback(err, false, {message: 'bad password'});
            }
            console.log('User Found, returning user');
            return callback(null, user);
        });
    });
});

但是当我尝试使用console.log(info)时,它只是说未定义。 我不知道如何让这个自定义回调工作...任何帮助将不胜感激!

采纳答案:

我相信你的'authenticate'静态调用的回调函数(在你的代码中称为'回调')接受第三个参数 - “info” - 你的代码可以提供。 然后,不要传入{failureRedirect:...}对象,而是传入一个包含3个参数 - err,user和info的函数。 您在身份验证方法中提供的“信息”将被传递给此回调。

护照将此场景称为“自定义回调”。 请参阅这里的文档: http : //passportjs.org/guide/authenticate/

参考更多解答:在Passport.js身份验证失败时发回JSON响应,转载请保留在Passport.js身份验证失败时发回JSON响应

更多:node.js