J'ai un projet basé sur express avec une authentification requise basée sur passeport.
Le backoffice est une application angularjs servant de fichiers statiques.
Mon code d'authentification est entièrement basé sur https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js
Pour ne pas servir l'application angular si vous n'êtes pas authentifié. J'ai essayé en ajoutant assureAuthenticated sur la route/admin mais cela rend la route non opérationnelle (404). Une fois que je supprime assureAuthenticated la/admin est servi.
app.use(express.static(path.join(__dirname, 'public')));
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin')));
//serve routes
app.use(app.router);
Le dossier public contient la page de connexion.
Comment pourrais-je y parvenir?
Vous pouvez vérifier l'itinéraire à l'aide d'un middleware et les rediriger s'ils ne sont pas connectés et affichent des pages d'administration, quelque chose comme (non testé):
app.use(function(req, res, next) {
if (req.user == null && req.path.indexOf('/admin') === 0)
{
res.redirect('/login');
}
next();
});
Ran dans le même problème, c'est ce que j'ai fini par faire!
app.use ne vous permet pas de chaîner les middlewares de cette manière. Les différentes fonctions app.VERB le font, mais pas app.use. C'est pour un middleware à la fois.
Si vous divisez les 2 middlewares en appels séparés, vous devriez obtenir les résultats souhaités:
app.use('/admin', ensureAuthenticated);
app.use('/admin', express.static(path.join(__dirname, 'admin')));
app.use('/admin', function(req,res,next){
if(req.user){
return express.static(path.join(__dirname, 'public'));
} else {
res.render(403, 'login', {message:'Please, login!'});
}
});
//serve routes
app.use(app.router);
Mettre à jour pour [email protected]+
, [email protected]
Et [email protected]
Configurez d'abord une stratégie d'authentification de passeport. Si vous utilisez un jwt, vous pouvez prendre un jeton d'un paramètre de requête, sinon vous pouvez utiliser une autre fonction d'extraction (ou plusieurs en utilisant Jwt.ExtractJwt.fromExtractors()
)
passport.use('basic-user',
new Jwt.Strategy({
...jwtConfig.options,
jwtFromRequest: Jwt.ExtractJwt.fromUrlQueryParameter('token')
}, verifyUser)
);
Ensuite, vous pouvez utiliser une fonction d'authentification de passeport avant de servir des fichiers statiques
app.use('/files', [
passport.authenticate(['basic-user'], { session: false }),
express.static(path.join(__dirname, 'files')) //make sure you access proper directory
])