1

我是使用 Passport.js 的新手,但我发现它到目前为止进展顺利。我正在使用带有本地护照的护照。

但是,我想要求对不包括一页的整个目录进行身份验证。所以在我的节点服务器中,我像这样(使用快递)提供这个目录:

app.use("/admin", express.static(__dirname + "/admin"));

然后我想让用户点击/admin/login.html,所以我想做这样的事情:

app.get('/gb-admin/login.html', function(req, res){ });

然后我想要求对其余部分进行身份验证,所以是这样的:

app.get('/gb-admin/*', ensureAuthenticated, function(req, res){});

这是我的 ensureAuthenticated 函数,如果有帮助,请参考:

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/gb-admin/login.html')
}

我该怎么做呢?我通常一直在无限循环中发送东西并导致浏览器超时。任何人都可以帮忙吗?

4

2 回答 2

2

你得到超时的原因是你不能有一个空的路由处理程序;在某一时刻,您必须返回响应,或者将请求交给下一个路由处理程序/中间件。

也就是说,试试这个:

function ensureAuthenticated(req, res, next) {
  if (req.path === '/gb-admin/login.html' || req.isAuthenticated()) {
    return next();
  }
  res.redirect('/gb-admin/login.html')
}

app.get('/gb-admin/*', ensureAuthenticated, function(req, res, next) {
  next();
});

// the static middleware needs to be declared after the route above, otherwise
// it will take precedence and ensureAuthenticated will never be called.
app.use("/gb-admin", express.static(__dirname + "/admin"));

我认为没有办法让它与登录页面的单独路由一起工作(除非您实际上login.html在没有该路由处理程序的情况下实现读取和发送回它),因此在ensureAuthenticated中间件中检查它。

于 2013-04-11T06:05:39.663 回答
1

我想知道这是不是你的回调。尝试:

app.get('/gb-admin/*', function (req, res, next) {
  ensureAuthentication(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/gb-admin/login.html')
  });
});
于 2013-04-11T01:52:37.303 回答