我是使用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')
}
我该怎么做呢?我一直在无限循环中发送内容并导致浏览器超时。有人可以帮忙吗?
答案 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')
});
});