检查每个node.js请求的身份验证凭据

oogrdqng  于 2023-05-28  发布在  Node.js
关注(0)|答案(3)|浏览(224)

我使用node.js和Express以及connect-auth来验证用户。
这是请求/index时的验证:

if(req.isAuthenticated()) {
  res.redirect('/dashboard');
} else {
  res.render('index', { layout: 'nonav' });
}

但是,在注销并返回f. e.之后。'/dashboard',我可以看到 Jmeter 板。
如何对每个请求进行身份验证检查,以确保始终有一个有效的用户?
我没有任何问题的身份验证,一切正常!我需要一个解决方案,检查每个路由/请求,如果有一个有效的用户,而不是把一个函数或if语句中的路由实现,因为整个应用程序需要一个有效的用户无论如何。Express-Authentication-Example在路由定义中使用了“restrict”,这很接近,但对于许多路由,它很容易被遗忘。

doinxwow

doinxwow1#

app.all('*',function(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401)); // 401 Not Authorized
    }
});
// NOTE: depending on your version of express,
// you may need to use app.error here, rather
// than app.use.
app.use(function(err,req,res,next){
    // Just basic, should be filled out to next()
    // or respond on all possible code paths
    if(err instanceof Error){
        if(err.message === '401'){
            res.render('error401');
        }
    }
});

如果你在需要认证的路由之前定义all路由,而在不需要认证的路由之后定义all路由(例如主页、登录等),那么它应该只影响需要它的路由。或者,您可以使用RegExp而不是'*',这将包括需要身份验证的子路径或路径列表。
另一种选择是创建一个函数,包含在每个需要auth的路由中:

function IsAuthenticated(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401));
    }
}
app.get('/login',function(req,res,next){
    res.render('login');
});
app.get('/dashboard',IsAuthenticated,function(req,res,next){
    res.render('dashboard');
});
app.get('/settings',IsAuthenticated,function(req,res,next){
    res.render('settings');
});
8cdiaqws

8cdiaqws2#

您可以使用connect提供的sessions机制。将以下代码放入app.configure()以启用它:

app.use(express.cookieParser());
  app.use(express.session({
    secret: 'some string used for calculating hash'
  }));

之后,您将能够使用req.session对象(每个请求都不同)来存储身份验证数据(或其他任何内容)。因此,您的示例代码看起来像这样:

if (req.session && req.session.authorized) {
  res.redirect('/dashboard');
}
else {
  res.render('index', {layout: 'nonav'});
}

身份验证将如下所示:

req.session.authorized = checkPassword(login, passw);

注销:

req.session.destroy();

更多信息可以在here中找到。

yacmzcpb

yacmzcpb3#

另一种方法是使用中间件功能。(CoffeeScript中的示例。)

# middleware
authKick = (req, res, next) ->
  if not do req.isAuthenticated then return res.redirect '/login'
  return do next

# apply
app.use authKick

这将在每个请求上工作,而不必触及路由。

相关问题