Esto me viene genial para mi portfolio y una landingpage 🚀
Introducción
Cómo autenticar usuarios con Node.js
Autenticación vs. autorización
Tienda en línea: instalación del proyecto
Protección de contraseñas
Middleware de verificación
Hashing de contraseñas con bcryptjs
Implementando hashing para usuarios
Passport y JSON Web Tokens
Implemetando login con Passport.js
¿Qué es un JWT?
Firmar y verificar tokens
Generar JWT en el servicio
Protección de rutas
Control de roles
Obteniendo órdenes del perfil
Manejo de la autenticación desde el cliente
Envío de emails con Node.js
Cómo enviar emails con Node.js
Implementando el envío de emails
Recuperación de contraseñas
Generando links de recuperación
Validando tokens para cambio de contraseña
Despliegue a producción
Deploy en Heroku
Próximos pasos
Cómo seguir aprendiendo backend con Node.js
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 9
Preguntas 1
Esto me viene genial para mi portfolio y una landingpage 🚀
Les dejo el template de Nodemailer que se usa en el video:
"use strict";
const nodemailer = require("nodemailer");
// async..await is not allowed in global scope, must use a wrapper
async function main() {
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.ethereal.email",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass, // generated ethereal password
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: '"Fred Foo 👻" <[email protected]>', // sender address
to: "[email protected], [email protected]", // list of receivers
subject: "Hello ✔", // Subject line
text: "Hello world?", // plain text body
html: "<b>Hello world?</b>", // html body
});
console.log("Message sent: %s", info.messageId);
// Message sent: <[email protected]>
// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}
main().catch(console.error);
No intenten robarle la cuenta de prueba al profe, jaja, estos hackers no dejan a nadie tranquilo
Por alguna razón que no llego a comprender obtuve este error al seguir la clase:
node:internal/process/promises:246
triggerUncaughtException(err, true /* fromPromise */);
^
Error: self signed certificate in certificate chain
Lo solucioné agregando el siguiente código en createTransport:
tls: {
rejectUnauthorized: false
}
Si alguien me puede explicar por que tuve este error le agradezco 😃
Para los que definireron las variables de ambiente con la contraseña y el email, recordemos que debemos dentener y volver a correr nuestro backend, debido a que las variables de ambiente no poseen live reloading.
looking good 👽
Tutorial actual de configurar contraseña de aplicación
https://support.google.com/accounts/answer/185833?hl=es
Para hacer la recuperación de contraseñas se utilizará la librería Nodemailer, el comando de instalación es npm install nodemailer
.
Nos brinda un código base:
"use strict";
const nodemailer = require("nodemailer");
// async..await is not allowed in global scope, must use a wrapper
async function main() {
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.ethereal.email",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass, // generated ethereal password
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: '"Fred Foo 👻" <[email protected]>', // sender address
to: "[email protected], [email protected]", // list of receivers
subject: "Hello ✔", // Subject line
text: "Hello world?", // plain text body
html: "<b>Hello world?</b>", // html body
});
console.log("Message sent: %s", info.messageId);
// Message sent: <[email protected]>
// Preview only available when sending through an Ethereal account
console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}
main().catch(console.error);
La librería tiene un servidor que emula pruebas de email (testAccount
), en transporter
se ve por dónde se va a enviar el correo, qué servidor de smtp, se coloca la configuración del email. En un email real, se cambia el port
a 465, se coloca true
en secure
y se cambian los datos de la propiedad auth
por el email y password que se usará en la aplicación.
En info
se coloca de quíen, para quién, el asunto y cuerpo del mensaje.
Para usar gmail como servidor smtp, en la opción de Cuenta → Seguridad, se crea una contraseña para aplicación (se debe tener configurada la verificación en dos pasos). Esa contraseña será únicamente para la aplicación y debe ser puesta como variable de entorno al igual que el user (email). Por ejemplo:
const nodemailer = require('nodemailer');
// async..await is not allowed in global scope, must use a wrapper
async function sendMail() {
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
secure: true, // true for 465, false for other ports
port: 465,
auth: {
user: '[email protected]',
pass: 'jgrcrj3tgf3knvs',
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: '"Platzinautas Boo 👻" <[email protected]>', // sender address
to: '[email protected]', // list of receivers
subject: 'Nuevo correo de prueba', // Subject line
text: 'Estoy usando Nodemailer!', // plain text body
html: '<b>¡Holaaaaaaaaaa!</b>', // html body
});
console.log('Message sent: %s', info.messageId);
// Message sent: <[email protected]>
// Preview only available when sending through an Ethereal account
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}
sendMail();
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.