node.js - con - jwt node express
Organizar rutas con middleware de autenticación (2)
Tengo muchas rutas La mayoría de ellos requiere autenticación. Uno no.
Aquí están:
router.get(''/secure1'', function (req,res) {...})
router.get(''/secure2'', function (req,res) {...})
router.get(''/secure3'', function (req,res) {...})
router.get(''/:id'', function (req,res) {...})
1. Imaginemos que no tenía la ruta pública.
En la parte superior de la página, podría poner un middleware de comprobación de seguridad, y todo está bien. Solo permitirá conexiones seguras y redireccionará no seguro.
router.use(function (req,res,next) {
securityCheck()
next()
})
router.get(''/secure1'', function (req,res) {...})
router.get(''/secure2'', function (req,res) {...})
router.get(''/secure3'', function (req,res) {...})
router.get(''/:id'', function (req,res) {...})
Esto funcionaría esto hace que todas las rutas seguras sean seguras, pero me bloquea de la ruta pública (''/: id'').
2. Podría mover la ruta pública a la cima:
router.get(''/:id'', function (req,res) {...})
router.use(function (req,res,next) {
securityCheck()
next()
})
router.get(''/secure1'', function (req,res) {...})
router.get(''/secure2'', function (req,res) {...})
router.get(''/secure3'', function (req,res) {...})
Pero de esta forma capta todas mis solicitudes y todos los caminos seguros son inaccesibles.
3. Podría poner un middleware en cada ruta segura, pero eso parece un poco tedioso y propenso a errores humanos:
router.get(''/secure1'',securityCheck(), function (req,res) {...})
Entonces, ¿hay una opción mejor que no consideré? ¿Qué se considera la mejor práctica?
Gracias
Si /:id
debe coincidir con un patrón particular, digamos un ObjectId
MongoDB, puede hacer que la coincidencia sea más específica para que no coincida con las otras rutas:
router.get(''/:id([a-fA-F0-9]{24})'', function (req,res) {...})
Si desea hacer coincidir ObjectId o nada, puede usar esto:
router.get(''/:id(|[a-fA-F0-9]{24})'', ...);
Más información aquí ( path-to-regexp
es el módulo que Express usa para realizar la coincidencia de URL).
De sus opciones, yo personalmente preferiría la primera. En el middleware siempre puede verificar en req.path
o req.url
para elegir qué configurar como seguro.
Otra opción es usar autenticación HTTP como en .htaccess. Eche un vistazo a https://github.com/http-auth/http-auth .
Una forma en que he hecho la autenticación antes era pasar nombre de usuario / contraseña sobre el cuerpo de la solicitud como json una vez y luego producir un token sin estado para futuras solicitudes ( https://github.com/auth0/node-jsonwebtoken ). En mi caso, no muchas de las entradas de enrutadores necesitaban autenticación, así que las manejé en las entradas mismas.
Además, para mayor seguridad, use HTTPS o codifique sus datos. P.ej. ¿Cómo crear un servidor HTTPS en Node.js?
Espero que haya sido de ayuda!