web-dev-qa-db-fra.com

Vérifiez chaque demande node.js pour les informations d'authentification

J'utilise node.js avec Express et connect-auth pour authentifier les utilisateurs.

Ceci est la vérification lors de la demande/index:

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

Cependant, après la déconnexion et le retour à f.e. '/ tableau de bord', je peux voir le tableau de bord.

Comment puis-je appliquer le contrôle d'authentification à chaque demande pour s'assurer qu'il y a toujours un utilisateur valide?

Mise à jour Je n’ai aucun problème d’authentification, tout fonctionne bien! J'ai besoin d'une solution qui vérifie chaque itinéraire/demande s'il y a un utilisateur valide, sans ajouter de fonction ou d'instruction if dans l'implémentation de l'itinéraire, car l'ensemble de l'application a besoin d'un utilisateur valide. L'exemple d'authentification rapide utilise "restrict" dans la définition d'itinéraire, qui est proche, mais peut être facilement oubliée avec de nombreux itinéraires.

26
Patrick
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');
        }
    }
});

Si vous définissez la route all avant les routes qui nécessitent une authentification et après les routes qui n'en ont pas (telle que la page d'accueil, la connexion, etc.), cela ne devrait affecter que les routes qui en ont besoin. Vous pouvez également utiliser un RegExp au lieu de '*', qui inclurait un sous-chemin ou une liste de chemins nécessitant une authentification.

Une autre option serait de créer une fonction à inclure dans chaque route nécessitant une autorisation:

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');
});
35
Zikes

Vous pouvez utiliser le mécanisme sessions fourni par connect. Mettez ce code dans app.configure() pour l'activer:

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

Ensuite, vous pourrez utiliser un objet req.session (différent pour chaque demande) pour stocker vos données d'authentification (ou toute autre chose). Ainsi, votre exemple de code ressemblera à ceci:

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

Et l'authentification ressemblera à ceci:

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

Connectez - Out:

req.session.destroy();

Plus d'informations peuvent être trouvées ici .

5
Alexey Zabrodsky

Une autre méthode consiste à utiliser une fonction de middleware. (Exemple dans CoffeeScript .)

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

# apply
app.use authKick

Cela fonctionnera à chaque demande sans avoir à toucher les itinéraires.

0
Nelo Mitranim