我正在尝试使用Compoundjs,Passportjs(复合护照)和Bcryptjs实现本地身份验证。 这是我的代码:
定义新策略
var Strategy = require('passport-local').Strategy;
passport.use(new Strategy({
usernameField: conf.usernameField || 'email'
}, exports.callback));
回调功能
exports.callback = function (email, password, done) {
exports.User.findOrCreate({
email: email,
password: password
}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(err, false);
}
var len = exports.User.verifyPassword.length;
if (len === 2) {
if (!exports.User.verifyPassword(password, user.password)) {
return done(err, false);
} else {
return done(err, user);
}
} else if (len === 3) {
exports.User.verifyPassword(password, user.password, function(err, isMatch) {
return done(err, !err && isMatch ? user : false);
});
}
return done(err, false);
});
};
User.verifyPassword
User.verifyPassword = function verifyPassword(password, hash, cb) {
bcrypt.compare(password, hash, function(err, isMatch) {
if(err) return cb(err);
return cb(null, isMatch);
});
};
在这种情况下,我收到以下错误:
错误:发送后无法设置标头。
它指的是成功登录后的重定向。 如果我使用verifyPassword而没有回调(同步模式),它可以正常工作:
User.verifyPassword = function verifyPassword(password, hash) {
return bcrypt.compareSync(password, hash);
};
我的代码中的错误在哪里?
答案 0 :(得分:0)
您可能需要为上次调用done()添加一条else语句,如下所示:
if (len === 2) {
if (!exports.User.verifyPassword(password, user.password)) {
return done(err, false);
} else {
return done(err, user);
}
} else if (len === 3) {
exports.User.verifyPassword(password, user.password, function(err, isMatch) {
return done(err, !err && isMatch ? user : false);
});
}
else {
// Added an ELSE statement here
return done(err, false);
}
如果没有这个else语句,将调用exports.User.verifyPassword()并调用return(错误,false)...然后最终在verifyPassword时调用done() )调用你给它的回调。
对done()的第二次调用可能是生成标题已设置错误。