Node Express - 重定向到登录页面视图

3
我正在尝试配置我的express应用程序,根据某些逻辑重定向到登录页面。我有以下内容:
  app.use('/', function(req, res, next){
    if(!req.session.accessToken){
      //do something here
    }
    next();
  });

我在我的应用程序目录的根目录中有一个名为login.html的文件,但我不确定需要在res对象上调用什么,例如 redirect send 。 此外,我知道上述代码实际上会导致无限循环。请问正确的方法是什么?

你是想要仅对 / 进行密码保护,还是除了登录页面以外的整个网站都进行保护? - Joachim Isaksson
除了登录页面以外的整个网站。所以我猜可以重定向到'/login',并为GET请求到'/login'设置路由处理程序,但我只需要知道如何提供login.html页面。 - mindparse
你尝试过 res.redirect("/your/url/here") 吗? - Raf
2个回答

1

您需要注意处理程序的顺序,如果您真的想自己完成而不使用Passport之类的东西,您需要像以下这样(有点骨架);

app.use('/login', function(req, res) {   // Allows access to login page
    res.send('displaying login page');   // before access token check
});

app.use(function(req, res, next) {       // Catches access to all other pages
    if(!req.session.accessToken) {       // requiring a valid access token
        res.redirect('/login');
    } else {
        next();
    }
});

// the rest of your routes go here, they should not be called unless authenticated

好的,那发送实际的 login.html 文件怎么样?我可以像 res.send(login.html) 这样做吗? - mindparse
如果您使用的是Express 4.8.0或更高版本,则最简单的方法可能是使用res.sendFile('login.html') - Joachim Isaksson

0

最明显的答案是简单地调用res.redirect('/login.html'),但这会向浏览器返回一个301(永久移动)代码。更语义上正确的解决方案可能是返回401(未经授权)并将login.html文件呈现给响应。

请参见是否可能发送401未经授权和重定向(带有位置)?

因此,解决方案可能如下所示:

app.use('/', function(req, res, next){
  if(!req.session.accessToken)
    res.status(401).sendFile(path.join(__dirname+'/login.html'));
  else
    next()
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接