No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Hashing de contraseñas en TypeORM

7/22
Recursos

Aportes 10

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola 👋
También podemos hashear la contraseña en la creación y en la actualización automáticamente con este método en su entidad. 🧐

@BeforeInsert()
@BeforeUpdate()
async hashPassword() {
  if (!this.password) return;

  const salt = await bcrypt.genSaltSync(10);

  this.password = await bcrypt.hashSync(this.password, salt);
}

Espero haberles ayudado 🚀

En caso de que alguien tenga preocupaciones de seguridad a la hora de traer el usuario con contraseña del DB ( en ocasiones es necesario), con typeORM se puede añadir el atributo “select” en la petición findOne y traer solo los atributos necesarios

const user = await this.userRepo.findOne(
            {
                where: { id },
                select: ["username", "email", "role"] }
            );

Para los que están usando Mongoose y quieren eliminar el password de la respuesta pueden instalar el paquete:
npm i nestjs-mongoose-exclude luego en su Entity utilizar el decorador @ExcludeProperty() y por último utilizar un Interceptor a nivel de ruta o del controlador completo
quedaría así:

@Prop({ required: true })
  @ExcludeProperty()
  password: string;
@UseInterceptors(
  new SanitizeMongooseModelInterceptor({
    excludeMongooseId: false,
    excludeMongooseV: true,
  }),
)
@Controller('users')

Es probable que el decorador exclude no funcione, para esto se hace necesario añadir el interceptor global de nest…

’ app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));

Para poder entender de una manera mas simple el hash, la particularidad de este método de seguridad es que el Hash en si no se desencripta una vez ha sido encriptado. Simplemente se compara el código (o password) ingresado al momento de iniciar sesión con el hash almacenado en la base de datos.

npm i bcrypt
npm i -D @types/bcrypt

Creo que una forma mas limpia seria hacer un pipe que realice un hashing de la contraseña.

En el caso de Mongo para hacer el findOne

  async findByMail(email: string) {
    return await this.UserModel.findOne({ where: { email: email } });
  }

👏

npm i bcrypt