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

Pat*_*ick 26 authentication connect node.js express

我正在使用带有Express和connect-auth的node.js来验证用户身份.

这是请求/索引时的验证:

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

但是,在注销并返回fe'/ dashboard'后,我可以看到仪表板.

如何对每个请求进行身份验证检查以确保始终存在有效用户?

更新 我的身份验证没有任何问题,一切正常!我需要一个解决方案,检查每个路由/请求是否有有效用户,而不在路由实现中放置函数或if语句,因为整个App无论如何都需要一个有效的用户.Express-Authentication-Example在路由定义中使用"restrict",它很接近,但是很多路由很容易被遗忘.

Zik*_*kes 35

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');
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

如果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');
});
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢`app.all`选项.但它会在每次请求时触发......甚至是对公共文件的请求!像.js和.css我可以避免吗? (2认同)

Ale*_*kii 5

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

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

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

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

身份验证将如下所示:

req.session.authorized = checkPassword(login, passw);
Run Code Online (Sandbox Code Playgroud)

登出:

req.session.destroy();
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到.