我正在设置动态路由并使用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.user
和auth.pass
,或者设置为false
。设置为false
时,我希望(显然)跳过身份验证。
basicAuth在开启时正在工作,但我无法弄清楚如何动态绕过它。
答案 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);