我正在使用带有Express和connect-auth的node.js来验证用户身份。
这是请求/ index时的验证:
if(req.isAuthenticated()) {
res.redirect('/dashboard');
} else {
res.render('index', { layout: 'nonav' });
}
然而,在退出并返回f.e. '/ dashboard',我可以看到仪表板。
如何对每个请求进行身份验证检查以确保始终有有效用户?
更新 我对身份验证没有任何问题,一切正常!我需要一个解决方案,检查每个路由/请求是否有有效用户,而不在路由实现中放置函数或if语句,因为整个App无论如何都需要一个有效的用户。 Express-Authentication-Example在路由定义中使用“restrict”,它很接近,但是很多路由很容易被遗忘。
答案 0 :(得分: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');
}
}
});
如果在需要身份验证的路由之前定义all
路由,在没有路由之后定义'*'
路由(例如主页,登录等),那么它应该只影响需要它的路由。或者,您可以使用RegExp而不是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');
});
,其中包括需要身份验证的子路径或路径列表。
另一个选择是创建一个函数以包含在需要auth的每个路由中:
{{1}}
答案 1 :(得分:5)
您可以使用sessions
提供的connect
机制。将此代码放在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。
答案 2 :(得分:0)
另一种方法是app.use中间件功能。 (CoffeeScript中的示例。)
# middleware
authKick = (req, res, next) ->
if not do req.isAuthenticated then return res.redirect '/login'
return do next
# apply
app.use authKick
这将适用于每个请求,而无需触及路线。