2013-11-24 56 views
0

我正在设置动态路由并使用basicAuth(当配置了用户/密码时)。下面是我有:NodeJS - Express bypass 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.userauth.passauth对象或设置为false文件中获取的配置。当设置为false我想(显然)跳过验证。

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

回答

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); 
+0

公顷,那么,总的感觉... – Fluidbyte

+0

乐意帮忙。更新了其他一些评论。 – loganfsmyth