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 avoir fermé la session et retourné à fe ‘/ dashboard’, je peux voir le tableau de bord.

Comment puis-je mettre 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 avec l’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 append de fonction ou d’instruction if dans l’implémentation de l’itinéraire, car l’ensemble de l’application a de toute façon besoin d’un utilisateur valide. L’exemple d’authentification rapide utilise “ressortingct” dans la définition d’itinéraire, qui est proche, mais peut être facilement oubliée avec de nombreux itinéraires.

 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 all itinéraires avant les itinéraires qui nécessitent une authentification et après les itinéraires qui ne le sont pas (tels que la page d’accueil, la connexion, etc.), cela ne devrait affecter que les itinéraires 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'); }); 

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

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

Après cela, vous pourrez utiliser l’object 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 .

Une autre méthode consiste à utiliser une fonction 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.