‫Instructor: Entonces, ahora debemos
‫enviar el token de restablecimiento de contraseña por correo electrónico al usuario.
‫Entonces, en esta conferencia, aprenderemos
‫cómo enviar correos electrónicos usando una solución muy
‫popular llamada Nodemailer.
‫Pero antes de hacer eso, en realidad
‫quería mostrarte el efecto de no tener esta opción aquí,
‫porque en realidad nunca te lo mostré antes.
‫Así que cortémoslo aquí, inténtelo ahora, nuevamente, y
‫ahora verá todos estos errores como por
‫favor confirme su contraseña.
‫Y, en realidad, debería haber
‫más, pero, bueno, este es ahora el primero que obtienes.
‫Básicamente, porque no tenemos ningún valor
‫en el campo de confirmación de contraseña.
‫¿Okey?
‫Y, de nuevo, eso se debe a
‫la validación y, de nuevo, podemos, por supuesto, desactivarlo
‫fácilmente con esta opción.
‫Pero de todos modos, ahora creemos una función de controlador de
‫correo electrónico que luego podamos usar en toda nuestra aplicación.
‫Así que lo haré
‫aquí mismo en la carpeta Utilidades,
‫nuevamente, y simplemente lo llamaré correo electrónico. js.
‫¿Está bien?
‫Y antes de hacer
‫cualquier otra cosa, instalemos el paquete Nodemailer.
‫Ese es el paquete que mencioné al
‫principio, que usaremos
‫para enviar correos electrónicos usando Node. js.
‫Entonces, como siempre, npm install nodemailer.
‫Y aquí.
‫Muy bien, y ahora creemos esa función aquí.
‫Correo electrónico constante, está
‫bien, y
‫luego aquí, básicamente vamos a pasar algunas opciones.
‫Entonces, la dirección de correo electrónico a la que queremos enviar un
‫correo electrónico, la línea de asunto, el contenido del correo
‫electrónico y tal vez algunas otras cosas.
‫Está bien.
‫Entonces, ahora debemos seguir tres
‫pasos para enviar correos electrónicos con Nodemailer.
‫Entonces, primero, necesitamos crear un transportador.
‫Luego,
‫en segundo lugar, tenemos que definir las opciones de correo
‫electrónico, básicamente, y
‫luego, al final, enviar el correo electrónico con Nodemailer.
‫¿Okey?
‫Entonces, el transportador que hicimos en el primer paso
‫aquí, es básicamente un servicio que realmente enviará el correo electrónico, porque no
‫es un nodo. js que realmente
‫enviará el correo electrónico.
‫Es solo un servicio que definimos aquí.
‫Algo como Gmail, por ejemplo.
‫Ahora, Gmail no es realmente el
‫servicio que
‫vamos a usar, pero permítanme mostrarles rápidamente
‫cómo funciona con Gmail, porque sé que muchas
‫personas estarán interesadas en esto, ¿de acuerdo?
‫Entonces, de todos modos, siempre necesitamos crear un transportador, y eso siempre
‫es lo
‫mismo, sin importar qué servicio usemos.
‫Entonces el transportador será
‫nodemailer. createTransport y
‫luego, por supuesto, necesitamos algunas opciones allí.
‫¿Está bien?
‫Entonces podemos especificar el servicio y podemos
‫decir que queremos usar Gmail.
‫Así que, así.
‫Y hay un par de servicios
‫bien conocidos con los que Nodemailer sabe cómo manejar,
‫por lo que no tenemos que configurarlos manualmente.
‫Por eso, Gmail es solo uno de ellos.
‫Pero también está Yahoo, Hotmail o muchos otros, ¿de acuerdo?
‫Así que
‫ese es el servicio, y luego también necesitamos especificar la propiedad
‫auth, básicamente para la autenticación.
‫Entonces necesitamos un usuario y una contraseña.
‫Y así, como antes, guardamos
‫ese tipo de cosas en nuestra configuración. n archivo.
‫Está bien.
‫Entonces, correo
‫electrónico, es un
‫nombre de usuario, y ahora no voy a usar
‫una dirección de Gmail real aquí porque,
‫nuevamente, no estamos usando Gmail, pero solo como un ejemplo aquí, está bien.
‫Tu contraseña.
‫Está bien.
‫Así que aquí hemos terminado,
‫digamos,
‫procesar punto final punto
‫EMAIL_USERNAME el
‫proceso de contraseña punto final
‫punto EMAIL_PASSWORD y
‫espero haberlo escrito correctamente.
‫¿Okey?
‫Y esta es
‫la configuración para el transporte en Nodemailer.
‫Luego, en su cuenta de
‫Gmail, tendrá que
‫activar algo llamado la opción de aplicación menos segura.
‫Déjame escribir eso aquí.
‫Y nuevamente, no lo voy a
‫hacer aquí, pero
‫sé que mucha gente realmente querrá usarlo.
‫Y la razón por la que no usamos
‫Gmail en esta aplicación es
‫porque Gmail no es una buena idea para una
‫aplicación de producción.
‫Y eso es básicamente lo que estamos tratando de construir aquí.
‫¿Okey?
‫Entonces, al usar Gmail para este tipo
‫de cosas, solo puede enviar 500 correos electrónicos por
‫día y, además, probablemente se lo marcará muy
‫rápidamente como spammer y, a partir de ahí, solo irá cuesta abajo.
‫¿Está bien?
‫Entonces, a menos que sea como una aplicación
‫privada, y solo te envíes correos electrónicos
‫a ti mismo, o, como,
‫a 10 amigos, bueno, entonces deberías usar otro servicio.
‫Y algunos conocidos son SendGrid y Mailgun.
‫Y, de hecho, usaremos SendGrid un poco más adelante
‫en este curso.
‫Ahora, lo que vamos a hacer
‫ahora es utilizar un servicio de desarrollo
‫especial, que básicamente falsifica para enviar correos electrónicos a direcciones reales.
‫Pero, en realidad, estos correos electrónicos terminan atrapados en una
‫bandeja de entrada de desarrollo, por lo que luego podemos ver cómo
‫se verán más adelante en la producción.
‫¿Está bien?
‫Entonces, ese servicio se llama Mailtrap, y
‫ahora vamos a registrarnos para eso.
‫Entonces.
‫Mailtrap. io, ¿de
‫acuerdo?
‫Entonces, y como digo, pruebas de correo electrónico seguras para
‫la puesta en escena y el desarrollo.
‫Entonces, básicamente, con
‫este servicio, puede falsificar para enviar correos electrónicos a los
‫clientes, pero estos correos electrónicos nunca llegarán a estos
‫clientes y, en cambio, quedarán atrapados en su Mailtrap, ¿de acuerdo?
‫Y de esa manera
‫no puede enviar accidentalmente algunos correos electrónicos de desarrollo a
‫todos sus clientes o usuarios, está bien.
‫Así que anímate y regístrate ahora.
‫Yo, por supuesto, ya tengo mi cuenta, por
‫lo que simplemente iniciaré sesión ahora.
‫Nos vemos en un segundo, después de
‫haber creado su cuenta gratuita.
‫Muy bien, después de crear su
‫cuenta, probablemente se verá un poco así.
‫Ahora, no tendrá ninguna bandeja de entrada por
‫ahora, así que creemos una nueva, con el
‫nombre de natours.
‫Entonces, ya tengo uno, pero simplemente cree uno nuevo aquí, con el
‫nombre de natours, y luego presione Crear Bandeja de entrada.
‫¿Está bien?
‫Entonces podemos abrirlo,
‫y verá que no tenemos correo electrónico en
‫este momento, pero lo que
‫importa por ahora son estas credenciales aquí.
‫Como puede ver, tenemos nuestro host aquí,
‫tenemos el puerto, el nombre de usuario y la contraseña.
‫Y eso es lo que
‫vamos a especificar ahora en nuestro transporte en Nodemailer.
‫¿Está bien?
‫Así que comencemos con el host, bueno,
‫en realidad, con
‫el nombre de usuario, así que estos
‫dos, solo necesito copiarlos, así que copiemos a nuestro archivo de
‫configuración, entonces ese es el nombre
‫de usuario, luego esa
‫es la contraseña, y ahora también necesitamos especificar el host.
‫Bien, y eso es porque Mailtrap no
‫es uno de estos servicios predefinidos que viene con Nodemailer.
‫Está bien.
‫El puerto es 25.
‫Así que déjelo guardar,
‫y luego aquí, eliminemos esto, y lo que necesito
‫especificar en su lugar es el host, el
‫correo
‫electrónico, el host
‫y, por supuesto, el puerto.
‫Entonces, todo lo que acabamos de guardar antes.
‫De acuerdo, entonces la autenticación aquí es
‫exactamente la misma.
‫Eliminemos esto también y
‫pasemos al paso número dos.
‫Básicamente, definiendo algunas opciones para nuestro correo electrónico.
‫Está bien, y podríamos, por supuesto,
‫hacer los pasos dos y tres al mismo tiempo,
‫pero me gusta simplemente preferir estas opciones aquí primero.
‫Bien, y aquí especificamos de dónde
‫viene el correo electrónico,
‫el nombre
‫y luego la dirección de correo electrónico como esta.
‫A continuación, necesitamos la dirección del
‫destinatario, y esa, la especificaré como una opción, ¿de
‫acuerdo?
‫Básicamente, como argumento para esta función.
‫Entonces, este objeto de opciones
‫aquí, es el que pasamos a la función.
‫Está bien.
‫Entonces, en realidad, lo mismo para el tema y para el texto.
‫Dupliquemos esto aquí,
‫así que el asunto y
‫luego solo especificamos la propiedad del texto,
‫y esa, en las opciones, solo lo llamo mensaje.
‫Muy bien, esta es básicamente la versión
‫de texto del correo electrónico.
‫Pero luego también podemos especificar la propiedad HTML.
‫Bien, y ahora podríamos convertir este mensaje a HTML.
‫Y luego, haremos eso, pero por
‫ahora, mantengamos las cosas simples y no especifiquemos el HTML aquí, en absoluto.
‫¿Okey?
‫Así que simplemente déjelo en el texto.
‫¡Okey!
‫Y luego, finalmente,
‫al final, transporter, así que ese es el objeto
‫transporter que creamos aquí al principio, y
‫en eso, podemos llamar a sendMail
‫y en eso tenemos que pasar nuestras opciones de correo, ¿de acuerdo?
‫Y ahora esto realmente devuelve una Promesa.
‫Bien, de nuevo, esta es una función asincrónica,
‫y como no queremos trabajar directamente con Promises, usemos
‫async / await.
‫Está bien.
‫Así que declarando esto como una función
‫asincrónica y listo.
‫Está bien.
‫No queremos almacenar ningún resultado aquí,
‫lo que podríamos hacer, pero no estoy realmente interesado en eso.
‫Bien, y ahora simplemente exportémoslo como predeterminado
‫desde este módulo.
‫¡Está bien, se ve bien!
‫Ahora sigamos adelante e intentemos esto.
‫Y para empezar, tenemos que importarlo aquí, por supuesto.
‫Así que dupliquemos esto aquí,
‫entonces esto
‫es correo electrónico, y creo que la función se llama enviar correo electrónico.
‫Bueno.
‫Así que volvamos a nuestra función de middleware aquí, y comencemos
‫por definir la URL de restablecimiento.
‫Entonces, idealmente, el usuario hará clic en este correo electrónico
‫y podrá realizar la solicitud desde allí.
‫Y eso funcionará
‫más adelante cuando implementemos nuestro sitio web
‫dinámico, pero aún así, ahora queremos crear esta URL aquí, para que
‫el usuario pueda simplemente copiarla, para que
‫sea más fácil hacer esta solicitud.
‫Bien, básicamente necesitamos recrear
‫esta estructura de URL que tenemos aquí.
‫Así que este es para la
‫contraseña olvidada y guardémoslo aquí.
‫Entonces, olvidé la contraseña, y ahora la URL que estamos creando
‫es en realidad para restablecer la contraseña.
‫Entonces, recuerde, ya lo implementamos antes.
‫Bueno.
‫Sigamos adelante y
‫copiemos aquí, así que restablezca la contraseña, ¿de acuerdo?
‫Y eso tomará el token
‫como parámetro.
‫De acuerdo, pongamos aquí cualquier ficha aleatoria por ahora.
‫Entonces no importa en absoluto.
‫Déjame
‫guardarlo aquí, como restablecer contraseña.
‫Bueno.
‫Y además, no es GET, tampoco es POST,
‫pero es PATCH, porque el resultado de
‫esto será la modificación de la propiedad de la contraseña
‫en el documento del usuario.
‫Entonces, PATCH es el mejor en realidad, ¿de acuerdo?
‫Así que cambiemos rápidamente nuestra implementación de ruta para esto.
‫Entonces, está aquí en userRoute, por lo que
‫no es POST, es PATCH,
‫y también queremos especificar un parámetro.
‫Entonces, recuerde cómo lo hacemos.
‫Así que es como aquí abajo.
‫Entonces, otra barra, luego dos puntos, y luego
‫el nombre del parámetro, que será token.
‫Bien, construyamos esto
‫ahora, comenzando con el protocolo.
‫Entonces, HTTP o HTTPS, ¿de acuerdo?
‫Y básicamente obtendremos esos datos de nuestra solicitud.
‫Entonces, eso se almacena en el protocolo
‫de puntos de solicitud, luego en dos puntos, y luego en el host, ¿de acuerdo?
‫Así que básicamente estamos preparando este aquí para
‫trabajar tanto en desarrollo como en producción.
‫Entonces, solicite dot get y luego
‫host.
‫De acuerdo, así es como obtenemos el
‫host, y luego api slash slash versión uno, y supongo que no es
‫ideal para definir un nivel codificado como este,
‫pero nuevamente, esto
‫es algo que vamos a arreglar
‫un poco más tarde. ¿okey?
‫Y veo que esto en realidad no es correcto.
‫Estos tirantes deberían estar ahí.
‫Entonces, ahora, usuarios,
‫resetPassword,
‫y luego otra barra, y finalmente el token.
‫Bien, entonces, resetToken.
‫¿Está bien?
‫Y como discutimos antes, en la
‫última conferencia, aquí
‫tenemos que enviar el resetToken original y simple, y no el cifrado.
‫¿Está bien?
‫Luego, en el
‫siguiente paso, compararemos el token original con el cifrado.
‫Entonces, nuevamente, tal como lo discutimos en el último video.
‫Guárdelo aquí ahora, y esa es nuestra URL de restablecimiento.
‫Y ahora, basándonos en esta URL, creemos rápidamente el
‫mensaje aquí también.
‫Entonces, ¿olvidaste tu contraseña?
‫Envíe una solicitud de PATCH con su nueva contraseña y
‫contraseña Confirme, por supuesto, a
‫la URL de
‫restablecimiento que acabamos de crear, ¿de acuerdo?
‫Básicamente, darle al usuario algunas instrucciones aquí.
‫Luego, en una nueva línea,
‫también decimos, si no olvidó su contraseña, ignore
‫este correo electrónico.
‫Así que ese es un mensaje común y,
‫de nuevo, estoy seguro de que lo ha visto de
‫una forma u otra, de acuerdo.
‫Así que, finalmente, enviemos el correo electrónico
‫y recuerde que sendEmail es
‫una función asincrónica.
‫Y entonces, por lo tanto, debemos esperarlo aquí.
‫¿Okey?
‫Porque, por supuesto, devolverá una Promesa.
‫Y recuerde ahora que la función sendEmail aquí
‫toma un objeto con algunas opciones.
‫Entonces el correo electrónico es usuario. correo electrónico, ¿verdad?
‫O también podríamos decir, req. cuerpo. Email.
‫Entonces eso es exactamente lo mismo, en realidad, ¿verdad?
‫Entonces, el tema que
‫queremos decir es, su token de restablecimiento de contraseña.
‫Digamos de inmediato que solo es válido por 10
‫minutos, para que el usuario sepa que tiene que darse prisa.
‫Bien, y finalmente, el mensaje también.
‫Bueno.
‫Entonces, esperamos eso, y
‫luego de eso, también enviemos, por supuesto, alguna respuesta.
‫De acuerdo, siempre debe haber una respuesta; de
‫lo contrario, como ya
‫sabe, el ciclo de solicitud / respuesta nunca terminará.
‫Entonces, simplemente enviamos un código
‫200 y luego un mensaje con un formato agradable
‫con un estado de
‫éxito, y luego solo un mensaje
‫rápido que dice: Token enviado al correo electrónico.
‫Está bien.
‫Y, por supuesto, no podemos enviar el token de restablecimiento aquí mismo,
‫junto a la derecha, porque entonces todos podrían restablecer la
‫contraseña de cualquier persona y
‫hacerse cargo de cualquier cuenta que quisieran.
‫Y esa es la razón por la que lo
‫enviamos a una dirección de correo electrónico, porque
‫asumimos que el correo electrónico es
‫un lugar seguro, al que solo el usuario tiene acceso.
‫Está bien.
‫Vaya, entonces, este video, nuevamente se está ejecutando bastante largo, pero
‫aún no hemos terminado.
‫Ya casi terminamos, pero no del todo,
‫porque puede ocurrir un error
‫al usar este sendEmail, está bien, y en ese caso, por
‫supuesto, queremos enviar un mensaje de error al cliente.
‫Pero en este caso, necesitamos hacer más que
‫simplemente enviar un mensaje de error.
‫Básicamente, necesitamos retroceder el token de restablecimiento de contraseña
‫y el restablecimiento de contraseña expiró que definimos, ¿de acuerdo?
‫Así que ahora mismo no es suficiente
‫simplemente detectar el error y luego
‫enviarlo a nuestro middleware global de manejo de errores.
‫Pero en su lugar, simplemente necesitamos
‫agregar un bloque try-catch aquí.
‫De nuevo, como queremos hacer
‫más que simplemente enviar un error al cliente,
‫básicamente tratamos de hacer esto, correcto, pero
‫en caso de que haya un error,
‫entonces, por supuesto, este bloque aquí se ejecuta.
‫¿Está bien?
‫Entonces, lo que queremos hacer en ese
‫caso, bueno, básicamente queremos, como
‫dije, restablecer tanto el token como la propiedad expires.
‫Bueno.
‫Entonces, passwordResetToken, y
‫configúrelo como indefinido, de acuerdo.
‫Y lo mismo para passwordResetExpires.
‫Bueno.
‫Y luego, por supuesto, como
‫antes, esto solo modifica los datos, pero en realidad no los guarda.
‫Y entonces vamos a agregar, tomar
‫este, y así básicamente guardar los datos en este caso.
‫Bien, y para terminar,
‫por supuesto, volvemos con un error al
‫siguiente middleware.
‫Entonces, newAppError,
‫hubo un error al enviar el correo electrónico.
‫Vuelve a intentarlo más tarde.
‫Y en este caso, el código de error puede ser 500.
‫Entonces, esto es realmente como un error que sucedió en
‫el servidor, por lo que tiene que ser
‫un código de cinco, y 500 es, como, el estándar.
‫Está bien.
‫Entonces, sigamos adelante e intentemos esto de nuevo, está bien.
‫Así que este es uno bastante largo de nuevo, pero bueno,
‫tenemos que hacerlo, ¿verdad?
‫Entonces, olvidé la contraseña, con este correo electrónico, echemos un vistazo.
‫Por lo tanto, esto puede
‫no tomar mucho tiempo, debido al envío
‫del correo electrónico, pero en realidad funcionó ahora, tomó como cinco segundos, pero
‫vemos que Token se envía al correo electrónico.
‫y así, como sabemos, dado que usamos Mailtrap, en realidad no envió
‫este correo electrónico a hello @ jones. io, pero en
‫su lugar, el correo electrónico debería
‫estar ahora atrapado dentro de Mailtrap.
‫Y, de hecho, aquí en el lado izquierdo, ahora apareció.
‫Está bien.
‫Entonces, ese es el correo electrónico que especificamos y
‫aquí obtenemos nuestra bonita URL.
‫Bien, entonces el que creamos con el protocolo, el host
‫y luego también con el token.
‫Así que echemos un vistazo
‫si este es
‫realmente nuestro token simple, por
‫lo que termina en 88df y, de hecho, tenemos resetToken aquí, 88df.
‫Y ahora en la base de
‫datos, deberíamos tener el token terminado en 1111.
‫Entonces, confirmemos eso, aquí en
‫Compass, vuelva a cargarlo y, de hecho, aquí vamos, ¿de acuerdo?
‫Y de nuevo, esto aquí es en 10 minutos a partir de ahora.
‫Genial, así que terminamos esa parte.
‫A continuación, en el siguiente video, realmente
‫restableceremos la contraseña, basándonos, por
‫supuesto, en la nueva contraseña que
‫el usuario envía con la solicitud de restablecimiento de contraseña.
‫Entonces, nos vemos allí.