节点js保持重定向 - 中间件

时间:2017-07-17 12:44:56

标签: javascript node.js express firebase

我正在尝试使用节点js和express编写中间件。如果用户未经过身份验证,则会将其重定向到登录页面。

这是有效的,但一旦重定向到登录页面,它会一次又一次地重定向到登录页面。

app.get('/profile',function(req,res){
   if (isAuthenticated()) {
       res.sendFile(path.join(__dirname+'/site/profile.html'));
   }else{
       console.log('not authenticated user at profile');
       res.redirect('/login');
   }
});

登录

app.get('/login',function(req,res){
   if (isAuthenticated()) {
       res.redirect('/profile');
   }else{
       res.sendFile(path.join(__dirname+'/login.html'));
   }

});

编辑:

控制台(循环):未在配置文件中经过身份验证的用户

用于身份验证的Firebase方法

function isAuthenticated(){
   var user = firebase.auth().currentUser;
   console.log(user);
   if(user && user !== null){
       return true;
   }else{
       return false;
   }
}

返回null

1 个答案:

答案 0 :(得分:2)

我不会使用重定向,而是编写authenticationRequired中间件。此中间件将发送401状态代码并显示登录页面,或将请求传递给下一个回调。

function authenticationRequired(req, res, next) {
   if( isAuthenticated() ) {
       next()
   } else {
       res.status(401).sendFile(path.join(__dirname, 'login.html'));
   } 
}


// register the middleware for only one route
app.get('/profile', authenticationRequired, function(req,res) {
    res.sendFile(path.join(__dirname, 'site/profile.html'));
});

// or register the middleware for all routes that follow 
app.use(authenticationRequired)

app.get('/profile', function(req,res) {
    res.sendFile(path.join(__dirname+'/site/profile.html'));
});

这样您就不需要手动跟踪用户在第一种情况下尝试打开的网址,登录后用户将保留在正确的网址上。

除此之外,您将使用正确的状态代码,而不是302,它告诉浏览器资源在您发送401的其他地方是临时的,告知浏览器需要进行身份验证显示请求的资源。