Express.js 4: use middleware para la autenticación antes que los archivos estáticos

En mi aplicación express he establecido archivos estáticos para ser servidos desde el directorio /public con esta línea:

 app.use(express.static(__dirname + '/public')); 

Ahora necesito agregar un middleware para la autenticación antes de servir el contenido estático y si el usuario no está autenticado para ser redirigido a una ruta para la autenticación (por ejemplo, /login ).
No estoy muy seguro de cómo tengo que hacerlo. ¿Algunas ideas?

Como no lo especificó, asumiré que ya tiene algún tipo de sistema de autenticación.

En Express, el orden de los middlewares en el código es importante: si desea que el middleware 1 se ejecute antes que el middleware 2, debe colocarlos en consecuencia en su código. Dado que express.static es un middleware, si desea la autenticación antes de servir sus archivos estáticos, simplemente puede escribir su middleware de autenticación antes de llamar a express.static

 app.use(function (req, res, next) { if (!userAuthenticated(req)) { return res.redirect('/login'); } next(); }); app.use(express.static(__dirname + '/public')); 

Supongo que tiene una función userAuthenticated que es, por ejemplo, verificar si las solicitudes HTTP contienen un token de acceso válido.

Lea más sobre middlewares.

Echa un vistazo a pasaporte .

El pasaporte tiene muchas estrategias de autenticación.

Aquí hay un ejemplo con autenticación HTTP básica:

 var express = require('express'); var passport = require('passport'); var BasicStrategy = require('passport-http').BasicStrategy; var db = require('./db'); // Configure the Basic strategy for use by Passport. // // The Basic strategy requires a `verify` function which receives the // credentials (`username` and `password`) contained in the request. The // function must verify that the password is correct and then invoke `cb` with // a user object, which will be set at `req.user` in route handlers after // authentication. passport.use(new BasicStrategy( function(username, password, cb) { db.users.findByUsername(username, function(err, user) { if (err) { return cb(err); } if (!user) { return cb(null, false); } if (user.password != password) { return cb(null, false); } return cb(null, user); }); })); // Create a new Express application. var app = express(); var authenticate = passport.authenticate('basic', { session: false, failureRedirect: '/login' }); app.use(authenticate, express.static(__dirname + '/public')); 

Depende del tipo de autenticación que esté buscando, pero si solo desea alguna función de inicio de sesión, esto es lo que necesita: http://passportjs.org/

Es compatible con las estrategias de inicio de sesión locales, así como un conjunto completo de estrategias de terceros como Facebook, Twitter, etc.

Si necesita algo más, más simple o de creación propia, simplemente escriba un middleware para usarlo antes de declarar el punto final estático, y llame a next () si todo se verifica, y vuelva a redirigir si el usuario necesita volver a intentarlo.

    Intereting Posts