【问题标题】:Node js Keeps redirecting - MiddlewareNode js不断重定向 - 中间件
【发布时间】:2017-12-22 00:24:26
【问题描述】:

我正在尝试使用 node 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

【问题讨论】:

  • 这里没发现什么问题,应该是别的地方。
  • 请看编辑
  • 你为什么要使用重定向?如果没有随请求发送身份验证信息,您可以将登录页面连接为中间件,并始终使用401 状态代码显示它。
  • isAuthenticated 在哪里运行?如果它在您的 express/node 进程中运行,那么 firebase.auth().currentUser 将不是从浏览器访问您的中间件的用户。您需要将用户的令牌从您的客户端代码传递到服务器并在那里进行验证:firebase.google.com/docs/auth/admin/verify-id-tokens

标签: javascript node.js express firebase


【解决方案1】:

我不会使用重定向,而是编写一个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 告诉浏览器需要验证才能显示请求资源。

【讨论】:

  • 您好,感谢您的回答!我已经实现了与您所说的相同的功能,但仍每 1-2 秒重新加载一次。这是我已经实现的代码。 PasteBin Link
  • 这表明你有一些其他的代码在重新加载,你有没有刷新的html标签或js代码?因为你展示的服务端代码不会有这样的效果。
  • 哦,是的!我正在使用 firebase onAuthStateChanged 函数。如果他已登录,则重定向用户。我评论了一条正在重定向的行。在这里看到code。但我对这件事很陌生。我很好奇如果 authStateIsChanged 登录,它会将用户重定向到个人资料吗?因为我已经评论了那行。
  • 不!在 authStateChanged 更改为 loggedIn 后,它不会重定向到个人资料页面。注意:firebase 代码是用 Vanilla JS 编写的。 @t.niese
  • @NomanAli 这是一个不同的问题,与 node 和 express 没有真正的关系,所以如果您需要进一步的帮助,您应该创建一个新问题并包含指向该问题的链接。
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 2021-03-18
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2016-06-14
相关资源
最近更新 更多