Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Implementando el envío de emails

16/20
Recursos

Aportes 6

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Estoy así con este curso 🤯🤯🤯🤯

Debido a que hay mucha lógica regada sobre autenticación, se crea un nuevo servicio para auth y hacer esto más mantenible.

auth.service.js, el método getUser contiene la lógica para autenticar un usuario, signToken contiene la lógica para firmar un token y sendMail contiene la lógica para enviar un email con sus respectectivas variables de ambiente:

const boom = require('@hapi/boom');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const nodemailer = require('nodemailer');

const { config } = require('../config/config');

const UserService = require('./user.service');
const service = new UserService();

class AuthService {
  async getUser(email, password) {
    const user = await service.findByEmail(email);
    if (!user) {
      throw boom.unauthorized();
    }

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      throw boom.unauthorized();
    }
    delete user.dataValues.password;
    return user;
  }

  signToken(user) {
    const payload = {
      sub: user.id,
      role: user.role,
    };
    const token = jwt.sign(payload, config.jwtSecret);
    return {
      user,
      token,
    };
  }

  async sendMail(email) {
    const user = await service.findByEmail(email);
    if (!user) {
      throw boom.unauthorized();
    }

    const transporter = nodemailer.createTransport({
      host: 'smtp.gmail.com',
      secure: true, // true for 465, false for other ports
      port: 465,
      auth: {
        user: config.mailerEmail,
        pass: config.mailerPassword,
      },
    });

    await transporter.sendMail({
      from: `"Foo Boo 👻" <${config.mailerEmail}>`, // sender address
      to: `${user.email}`, // list of receivers
      subject: 'Nuevo correo de prueba', // Subject line
      text: 'Estoy usando Nodemailer!', // plain text body
      html: '<b>Holaaaaaaaaaa!</b>', // html body
    });

    return { message: 'Mail sent' };
  }
}

module.exports = AuthService;

Se hacen las modificaciones pertinentes en los archivos auth.route.js y local.strategy.js donde se hace el uso del nuevo servicio.

auth.route.js, en el caso del endpoint /recovery, se obtiene el email del body, posteriormente se ejecuta el método sendMail que viene desde el servicio:

const express = require('express');
const passport = require('passport');
const AuthService = require('../../services/auth.service');

const router = express.Router();
const service = new AuthService();

router.post(
  '/login',
  passport.authenticate('local', { session: false }),
  async (req, res, next) => {
    try {
      const user = req.user;
      res.json(service.signToken(user));
    } catch (error) {
      next(error);
    }
  }
);

router.post('/recovery', async (req, res, next) => {
  try {
    const { email } = req.body;
    const rta = await service.sendMail(email);
    res.json(rta);
  } catch (error) {
    next(error);
  }
});

module.exports = router;

local.strategy.js, el método getUser contiene la lógica antes establecida en este archivo para autenticar un usuario:

const { Strategy } = require('passport-local');

const AuthService = require('../../../services/auth.service');
const service = new AuthService();

const LocalStrategy = new Strategy(
  {
    usernameField: 'email',
    passwordField: 'password',
  },
  async (email, password, done) => {
    try {
      const user = await service.getUser(email, password);
      done(null, user);
    } catch (error) {
      done(error, false);
    }
  }
);

module.exports = LocalStrategy;

El curso esta muy bien explicado y haberlo dividido en 3 o4 partes fue una gran idea

Solución RETO de correo y contraseña en variables de entorno:
.env

# Agregamos estas 2 líneas
EMAIL_SENDER[email protected]
EMAIL_PASSWORD=password

config.js

# Agregamos estas 2 líneas
emailSender: process.env.EMAIL_SENDER,
emailPassword: process.env.EMAIL_PASSWORD

Y finalmente en auth.service.js

# Modificamos esta parte
auth: {
     user: config.emailSender,
     pass: config.emailPassword
}

Saludos.

Urgente el boton de like!!!

esta clase va a mil por hora jaja