Node.js 护照认证系统不工作

Node.js 护照认证系统不工作,node.js,express,passport.js,Node.js,Express,Passport.js,我在express node应用程序中设置了身份验证系统,但我在设置passport身份验证时遇到了一些错误。例如,注册系统工作正常,我的验证系统也工作正常(它基本上检查用户/通行证组合是否对我学校的成绩册登录有效)。但是,实际的passport登录(检查user/pass组合是否是我的mongoose数据库中的注册用户)功能不正常 app.js的相关部分 user.js 最后,index.js 感谢所有的帮助。如果更容易处理,可以找到源代码 更新: 因此,根据最新的建议,我得到以下输出:因此

我在express node应用程序中设置了身份验证系统,但我在设置passport身份验证时遇到了一些错误。例如,注册系统工作正常,我的验证系统也工作正常(它基本上检查用户/通行证组合是否对我学校的成绩册登录有效)。但是,实际的passport登录(检查user/pass组合是否是我的mongoose数据库中的注册用户)功能不正常

app.js的相关部分

user.js

最后,index.js

感谢所有的帮助。如果更容易处理,可以找到源代码

更新: 因此,根据最新的建议,我得到以下输出:因此登录功能正常。然而,问题是,登录似乎循环并识别用户一次,然后显示“无效登录”消息,而不仅仅是完成过程

我发现了两个问题

第一:

在app.js文件中,配置LocalStrategy后,必须在检查用户凭据后调用done

见:

二:

在登录路由配置中,您必须处理调用下一个函数的错误,错误处理函数将捕获它

//login
router.post('/login', function(req, res, next) {

    passport.authenticate('local', function (error, user, info){
        if (user === false) {
            // handle login error ...
            next(new Error('AuthenticationError'), req, res);
        } else {
            // handle successful login ...
            res.redirect('/')
        }
    })(req, res, next);
});
编辑最后一条评论:

您不仅要检查用户是否
错误
,还要检查是否没有错误,请看:

//login
router.post('/login', function(req, res, next) {
    passport.authenticate('local', function (error, user, info){

        // A error also means, an unsuccessful login attempt
        if(error) {
            console.error(error);
            console.log('Failed login:');
            // And do whatever you want here.
            return next(new Error('AuthenticationError'), req, res);
        }

        if (user === false) {
            // handle login error ...
            console.log('Failed login:');
            return next(new Error('AuthenticationError'), req, res);
        } else {
            // handle successful login ...
            console.log('Successful login:');
            res.redirect('./');
        }
    })(req, res, next);
});
这对我来说很有用

关于
(req,res,next)
,它是中间件的参数

因此,您调用/login路由,得到请求和响应,接下来,您调用
passport.authenticate
。这个方法返回一个
函数(req,res,next)
,最后,您为它传递请求和响应

请参阅从
passport.authenticate中截取的代码:

module.exports = function authenticate(passport, name, options, callback) {
    ...
    // This is the function you call, when you do: (req, res, next)
    return function authenticate(req, res, next) {
    ...
查看更多有关中间件的示例


希望现在一切都清楚了。

问题是验证完成后,您缺少一个
验证回调。请尝试以下代码:

在下面的代码中,当您创建LocalStrategy时,函数中有三个参数,即username、password和done。现在,当您的
if(userIsValid)
有效时,您需要调用verify callback,它是
done(null,user)
。因此,当使用
passport.authenticate
进行身份验证时,您可以获得
用户

    passport.use(new LocalStrategy(function (username, password, done) {
        User.findOne({username: username}, function (err, user) {
            user.checkLogin(password, function (error, userIsValid) {
                if (error) {
                    console.log('Error:');
                    return done(error);
                }
                if (userIsValid) {
                    console.log('Valid:');
                    //Below is the code you are missing
                    return done(null, user)
                }
            });
        });
    }));
passport.authenticate
中的参数是从上面的验证回调传递的参数。因此,在这种情况下,回调中只需要两个参数,如下所示:

passport.authenticate('local', function (error, user){
    //your-code
});

我只是没有得到任何结果。我已经改变了我的答案,看看吧!我相信这是正确的。这似乎是我所需要的。只是有一个小问题(我在问题中更新了),原来的问题解决了,对吗?隐马尔可夫模型。。。但是好的。你把代码推到github了吗?原来的问题似乎已经解决了,只是需要一些微调才能正常运行(然后你就会收到赏金)你说的两次回调是什么意思?很抱歉,我不太明白你想说什么say@Steve你试过我说你丢失的密码了吗?请试一下。
//login
router.post('/login', function(req, res, next) {
    passport.authenticate('local', function (error, user, info){

        // A error also means, an unsuccessful login attempt
        if(error) {
            console.error(error);
            console.log('Failed login:');
            // And do whatever you want here.
            return next(new Error('AuthenticationError'), req, res);
        }

        if (user === false) {
            // handle login error ...
            console.log('Failed login:');
            return next(new Error('AuthenticationError'), req, res);
        } else {
            // handle successful login ...
            console.log('Successful login:');
            res.redirect('./');
        }
    })(req, res, next);
});
module.exports = function authenticate(passport, name, options, callback) {
    ...
    // This is the function you call, when you do: (req, res, next)
    return function authenticate(req, res, next) {
    ...
    passport.use(new LocalStrategy(function (username, password, done) {
        User.findOne({username: username}, function (err, user) {
            user.checkLogin(password, function (error, userIsValid) {
                if (error) {
                    console.log('Error:');
                    return done(error);
                }
                if (userIsValid) {
                    console.log('Valid:');
                    //Below is the code you are missing
                    return done(null, user)
                }
            });
        });
    }));
passport.authenticate('local', function (error, user){
    //your-code
});