Validación de contraseñas en LoopBack 3

Juan Antonio Gómez
shokmaster articles
2 min readMay 30, 2019

Desde hace un tiempo vengo trasteando con LoopBack 3, un excelente framework Node.js basado en Express.js. En el momento de enfrentarme a construir una API real, me he encontrado con algunos problemas básicos a los que, increíblemente, nuestros amigos de StrongLoop han decidido no darles solución (al menos en la v3).

Hoy quiero tratar el que más me ha llamado la atención, principalmente por razones de seguridad, y es el de la validación de contraseñas.

En la definición de un modelo, LB nos ofrece distintas funciones de validación de campos. En uno de los ejemplos vemos la validación de longitud para password:

Lo que todos pensamos al ver esto es que LB comprueba que el password que ha introducido el usuario tiene, como mínimo, 5 caracteres. ¡Pues no! Veamos qué ocurre.

LB genera un hash bcrypt para el password, hasta aquí genial; pero cuando utilizamos la función validatesLengthOf(), ésta se ejecuta sobre dicho hash, que obviamente siempre va a cumplir la regla de validación de longitud. Así valida cualquiera :)

Vale, han puesto en la documentación oficial un ejemplo erróneo, pero ¿LB no valida automáticamente las contraseñas en su built-in model user? Pues a medias. Como podemos ver en el código original, la función validatePassword() valida que la contraseña original no supere los 72 bytes, ya que bcrypt deshecha el resto, pero en ningún momento valida la longitud min/max que establezcamos nosotros.

Si no lo hace LoopBack y tampoco la función de validación, ¿qué hago? Pues no queda otra que reescribir la función validatePassword() como es debido:

PWD_MAX y PWD_MIN son dos valores que establecemos manualmente, según los requerimientos de negocio. Eso sí, debemos configurar nuestro PWD_MAX con un valor inferior a 72 bytes para conservar la restricción que la función tenía por defecto.

En este repo podéis encontrar esta función implementada.

Hasta la próxima!

--

--