Nodejs - Passport身份验证总是返回失败重定向
问题描述:
我正在通过passportJs进行表单登录,并且它始终返回failureRedirect。我在这个问题的堆栈溢出搜索,但仍然没有正确的答案。这里是我的代码:Nodejs - Passport身份验证总是返回失败重定向
-
表格制作形式玉:
form(method='post', action='/users/login', enctype='multipart/form-data') .form-group label Username input.form-control(name='username', type='text' placeholder='Enter Username') .form-group label Password input.form-control(name='password', type='password' placeholder='Enter password') input.btn.btn-default(name='submit', type='submit', value='Login')
路由器Hanlde使用快递框架形式的NodeJS和护照中间件:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.getUserById(id, function(err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function(username, password, done) {
User.getUserByUsername(username, function(err, user) {
if (err) throw err;
if (!user) {
console.log('Unknown User');
return done(null, false, {
message: 'Unknown User'
});
}
User.comparePassword(password, user.password, function(err, isMatch) {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
console.log('Invalid Password');
return done(null, false, {
message: 'Invalid Password'
});
}
});
});
}
));
router.post('/login', passport.authenticate('local', {
failureRedirect: '/users/login',
failureFlash: 'Invalid username or password'
}), function(req, res) {
console.log('Authentication Successful');
req.flash('success', 'You are logged in ');
res.redirect('/');
});
答
看着getUserByUsername
功能你在评论中分享,看起来你没有拨打的回拨函数以正确的方式,因此它不会得到user
对象导致失败重定向。您共享的功能是:
module.exports.getUserByUsername = function(username, callback){
var query = {username: username};
User.findOne(query, callback);
}
将其更改为以下应该解决您的问题:
module.exports.getUserByUsername = function(username, callback){
var query = {username: username};
User.findOne(query, function(err, user) {
callback(err, user);
});
}
你可以共享'getUserByUsername'和'comparePassword'功能码? – Raeesaa
@ user2235057是:我把它写在模型文件夹,文件user.js的: module.exports.getUserByUsername =功能(用户名,回调){ \t VAR的查询= {用户名:用户名}; \t User.findOne(query,callback); } module.exports.getUserByUsername = function(username,callback){ \t var query = {username:username}; \t User.findOne(query,callback); } –
这是'getUserByUsername'函数的完整代码吗?如果是这种情况,那么该功能就存在问题。代码应该是这样的:module.exports.getUserByUsername = function(username,callback){var query = {username:username}; User.findOne(query,function(err,user){callback(err,user)}); }并且你还没有共享'comparePassword'函数,所以我不确定这是否正确。 – Raeesaa