要求使用Passport.js / Node.js对目录(一页除外)进行身份验证?

时间:2013-04-11 00:14:25

标签: javascript jquery node.js authentication passport.js

我是使用Passport.js的新手,但我发现它到目前为止还不错。我正在护照本地使用Passport。

但是,我想要对除一个页面之外的整个目录进行身份验证。所以在我的节点服务器中,我正在提供这样的指令(使用快递):

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')
}

我该怎么做呢?我一直在无限循环中发送内容并导致浏览器超时。有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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中间件中。

答案 1 :(得分:1)

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

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