Implementación de Hashing en Proyecto Mongo con Node.js
Clase 8 de 22 • Curso de NestJS: Autenticación con Passport y JWT
Resumen
¿Cómo implementar la técnica de hashing en un proyecto Mongo?
El hashing es una técnica esencial para la seguridad de las contraseñas en las bases de datos. La implementación correcta asegura que las contraseñas almacenadas estén protegidas, incluso si la base de datos es comprometida. Aquí se explica paso a paso cómo aplicar el hashing en un proyecto basado en MongoDB usando la librería bcrypt
.
¿Cómo instalar la librería bcrypt
?
Para comenzar, es necesario instalar la librería bcrypt
. Esta librería permite realizar el hashing de contraseñas de manera eficiente y segura. Sigue estos pasos:
- Instala
bcrypt
junto con su tipado (para TypeScript), utilizando el siguiente comando:npm install bcrypt npm install @types/bcrypt --save-dev
- Asegúrate de que la instalación del tipado es solo para el entorno de desarrollo.
¿Cómo modificar el servicio de usuarios?
La lógica para manejar contraseñas debe ser incorporada en el servicio de usuarios de tu aplicación. Aquí es donde se recibe la contraseña y se realiza el hashing antes de guardarla en la base de datos.
-
Importa la librería en el archivo del servicio.
import * as bcrypt from 'bcrypt';
-
Implementa el hashing en el método de creación de usuarios antes de guardar los datos.
const hashPassword = await bcrypt.hash(newModel.password, 10); newModel.password = hashPassword;
-
Es fundamental hacer que el método sea asíncrono debido al uso de promesas con
await
.
¿Cómo excluir la contraseña de las respuestas?
Aunque las contraseñas ya estén hashadas, aún es una buena práctica no incluirlas en las respuestas del API.
-
Usa desestructuración para quitar el password del objeto antes de devolver la respuesta.
const { password, ...rta } = userModel.toJSON();
-
Devuelve únicamente la información necesaria al cliente.
¿Cómo probar el funcionamiento?
Usa herramientas como Insomnia para realizar peticiones al API y asegúrate de que las contraseñas no se incluyen en las respuestas. Comprueba que:
- Al crear un nuevo usuario, la contraseña se almacena en la base de datos en formato hash.
- La respuesta del API no debe incluir la contraseña, ni siquiera en forma hash.
¿Cómo buscar un usuario por email de forma segura?
Para futuras implementaciones, como la autenticación, necesitarás métodos que busquen usuarios sin comprometer la seguridad:
-
Implementa un método que busque usuarios usando su email:
async findByEmail(email) { return this.userModel.findOne({ email }).exec(); }
-
Asegúrate de usar
findOne
para evitar que se devuelvan múltiples resultados, dado que los emails deben ser únicos en la base de datos.
¿Cómo exportar el servicio para su uso en otros módulos?
El servicio debe ser accesible desde otros módulos, como el de autenticación, para funciones como verificar usuarios:
-
Exporta el servicio de usuarios desde su módulo:
export class UserService { // Métodos aquí }
-
Asegúrate de que otros módulos pueden importar y utilizar el servicio sin problemas.
Este proceso de implementación garantiza que las contraseñas de los usuarios estén protegidas y el sistema sea seguro. ¡Continúa practicando y mejorando tus habilidades! Recuerda que la seguridad es esencial en cualquier aplicación.