NodeJS - Express绕过basicAuth

时间:2013-11-24 21:46:40

标签: node.js express basic-authentication

我正在设置动态路由并使用basicAuth(当配置了用户/通道时)。这就是我所拥有的:

var basicAuth = express.basicAuth,
auth = function(req, res, next) {
    if (config.hasOwnProperty(req.params.project)) {
        var auth = config[req.params.project].auth;
        if (auth) {
            basicAuth(function(user, pass, callback) {
                // Check credentials
                callback(null, user === auth.user && pass === auth.pass);
            })(req, res, next);
        } else {
            // No authentication
            return true;
        }
    }
};

然后,我的路线看起来像这样:

app.get("/:project", auth, function (req, res) {
    ...
});

从文件中获取配置,该文件包含auth对象auth.userauth.pass,或者设置为false。设置为false时,我希望(显然)跳过身份验证。

basicAuth在开启时正在工作,但我无法弄清楚如何动态绕过它。

1 个答案:

答案 0 :(得分:2)

Connect不会检查中间件的返回值,因此返回true并不意味着什么。您需要调用next函数,以便Connect知道继续。

var basicAuth = express.basicAuth,
auth = function(req, res, next) {
    if (config.hasOwnProperty(req.params.project)) {
        var auth = config[req.params.project].auth;
        if (auth) {
            basicAuth(function(user, pass, callback) {
                // Check credentials
                callback(null, user === auth.user && pass === auth.pass);
            })(req, res, next);
        } else {
            // No authentication
            next();
        }
    }
};

此外,看起来basicAuth回调可以是同步的,所以这样做可能更干净:

basicAuth(function(user, pass) {
    // Check credentials
    return user === auth.user && pass === auth.pass;
})(req, res, next);

最后,basicAuth还有另一种替代形式,所以您可以这样做:

basicAuth(auth.user, auth.pass)(req, res, next);