护照验证超时

passport authenticate timing out

我刚刚开始我的 Node.js 之旅,我正在尝试解决制定本地用户登录策略的想法。

我一直在追踪我的功能并使用 Postman 进行测试。现在我的身份验证策略悬而未决,我无法理解为什么。

passport.use(new LocalStrategy(
    function(username, password, done){
        console.log(username) // <-- this doesn't log
        User.findOne({userName: username}, function(err, user){
            if(err) return done(err);
            if(!user){
                return done(null, false, {
                    message: 'Could not login with those details.'
                });
            }
            if(!user.validPassword(password)) {
                return done(null, false, {
                    message: 'Could not login with those details.'
                });
            }
            return done(null, user);
        })   
    }
))

我提出了一个非常基本的 post 应用身份验证的请求。

app.post('/login', function(req, res){
    console.log(req.body)
    if(!req.body.userName || !req.body.password ) {
        res.status(400),
        res.json({"status" : "fail", "message" : "All fields 
required"});
        return;
    }

    passport.authenticate('local', function(err, User, info){
        let token;

        if(err){
            res.status(400),
            res.json({"status" : "fail", "message" : err});
            return;
        }

        if(User){
            token = User.generateJwt();
            res.status(200);
            res.json({"status" : "success", "token" : token });

        }else{
            res.status(401);
            res.json({"status" : "fail", "message" : info });
        }
    })
}) 

据我所知,初始检查对于缺少的字段没有问题,但是当它到达 passport.authenticate 时它挂起并且似乎不符合我定义的策略。

我一直在浏览文档,我确定我在这里遗漏了一些东西,但就是看不到它。如果有人能指出正确的方向,我将不胜感激。

调用 passport.authenticate returns 中间件函数,签名为 (req, res, next)。在您的示例中,您使用了 custom callback 功能,因此您必须使用处理程序中的相关参数手动调用此结果函数:

app.post('/login', function(req, res){
    console.log(req.body)
    if(!req.body.userName || !req.body.password ) {
        res.status(400),
        res.json({"status" : "fail", "message" : "All fields 
required"});
        return;
    }

    passport.authenticate('local', function(err, User, info) {
        let token;

        if(err){
            res.status(400),
            res.json({"status" : "fail", "message" : err});
            return;
        }

        if (User) {
            token = User.generateJwt();
            res.status(200);
            res.json({"status" : "success", "token" : token });

        } else{
            res.status(401);
            res.json({"status" : "fail", "message" : info });
        }

    // perform an actual call
    })(req, res);
})

另请记住,passport-local 默认查找 username 字段,而不是像您在请求的参数验证中那样查找 userName