1

我正在尝试使用 Compoundjs、Passportjs (compound-passport) 和 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);
};

我的代码中的错误在哪里?

4

1 回答 1

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 done(err,false)...然后最终在 verifyPassword() 调用你给它的回调。

对 done() 的第二次调用可能会产生标头已设置错误。

于 2014-02-12T13:48:14.203 回答