Node.js 护照认证系统不工作
我在express node应用程序中设置了身份验证系统,但我在设置passport身份验证时遇到了一些错误。例如,注册系统工作正常,我的验证系统也工作正常(它基本上检查用户/通行证组合是否对我学校的成绩册登录有效)。但是,实际的passport登录(检查user/pass组合是否是我的mongoose数据库中的注册用户)功能不正常 app.js的相关部分 user.js 最后,index.js 感谢所有的帮助。如果更容易处理,可以找到源代码 更新: 因此,根据最新的建议,我得到以下输出:因此登录功能正常。然而,问题是,登录似乎循环并识别用户一次,然后显示“无效登录”消息,而不仅仅是完成过程 我发现了两个问题 第一: 在app.js文件中,配置LocalStrategy后,必须在检查用户凭据后调用done 见: 二: 在登录路由配置中,您必须处理调用下一个函数的错误,错误处理函数将捕获它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 感谢所有的帮助。如果更容易处理,可以找到源代码 更新: 因此,根据最新的建议,我得到以下输出:因此
//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
});