Parte 2: Verificación del correo electrónico
En esta tercera entrega de la construcción de Touchbase, voy a profundizar en la creación de un sistema de verificación de correo electrónico utilizando Couchbase, nodemailer, y la API Web Sendgrid. Lo primero que necesitarás hacer es descargar un par de módulos de node.
Las dos primeras entregas, Parte 0 y Parte 1cubren el modelo de datos y la creación de documentos de usuario, respectivamente.
Requisitos de la plataforma
- Node.js
- Express.js
- Una cuenta API de Sendgrid
- Generador de correo electrónico HTML O correo electrónico HTML redactado a mano
Módulos de nodo utilizados
- Couchbase Node.js SDK/N1QL (acceso a Couchbase)
- body-parser (convierte cadenas JSON en objetos JSON)
- uuid (para generar el ID del documento de verificación)
- nodemailer (envía correos electrónicos desde nuestra API de confirmación de correo electrónico)
- nodemailer-sendgrid-transport (enviar correos electrónicos nodemailer a través de Sendgrid)
En primer lugar, para traer los módulos de nodo, hacer:
|
1 |
$ npm install nodemailer --save |
Entonces:
|
1 |
$ npm install nodemailer-sendgrid-transport --save |
Si no estás familiarizado con Node, npm simplemente instala módulos por ti. La página -guardar final añadirá estos módulos a su paquete.json archivo. En el repositorio github de Touchbase, verá que ya están en el archivo paquete.json archivo.
En primer lugar, cree una cuenta Sendgrid para utilizar su API web gratuita. Asumiré que lo tiene y continuaré. Después de eso, tendrá que hacer una configuración sencilla de la API de Sendgrid para enviar correos electrónicos utilizando Sendgrid y nodemailer. La explicación del uso de estos dos servicios juntos está en Blog de Sendgrid y voy a ir más allá usando ese fragmento de código. Mi uso de esto en el modelos/sessionmodel.js en una función llamada Sesión.makeVerification. El punto final al que se llama a esta función se encuentra en rutas/routes.js como /api/registerUserdel que hablé largo y tendido en mi último blog. Esta función se llama al final de esa ruta para generar un correo electrónico de verificación, que el usuario debe pulsar antes de iniciar sesión en su cuenta, para evitar abusos del servicio.
En el models/usermodel.js el archivo 'Usuario.crear' tiene un campo booleano en el sub-objeto 'login' llamado 'emailVerified'. La importancia de esto, es que nuestra ruta de verificación cambiará este atributo del usuario a true, permitiéndole iniciar sesión si su email ha sido verificado.
Función 'Session.makeVerification
A continuación, llamamos al Email.crear modelo. Si examina el models/emailmodel.js verá un ejemplo de cómo hacerlo. Esto simplemente hace uso de un Conversor de cadenas HTML a Javascript que genera una cadena Javascript que se convierte en un correo electrónico HTML en la API de Sendgrid.
En nuestra Sesión.makeVerification realizamos una configuración básica para las API de nodemailer y Sendgrid. Introduzca las opciones, así como un nombre de usuario y una contraseña de API que se configuraron cuando creó su cuenta de Sendgrid. Elegí utilizar la API de Sendgrid y no una cuenta de correo electrónico personal con Nodemailer porque Sendgrid permite el seguimiento de todos los correos electrónicos, y asegura que sean entregados a tiempo. También garantizará que ninguno de los correos electrónicos caiga en las papeleras de spam, filtros de promoción, etc. De esta forma, los emails se enviarán de forma segura, y además se podrán aliasar con la dirección de email que deseemos. En este caso utilizo 'touchbase-noreply@couchbase.com' que no es un email oficial, pero mostrará claramente que el email es enviado desde Touchbase al usuario. Esto se puede hacer sin el usuario de la API Sendgrid también.
La siguiente parte de Sesión.makeVerification nos lleva a Email.create para construir la plantilla HTML de los correos electrónicos que enviaremos a los usuarios, que llama a una función en models/emailmodel.js. Si se fija bien, esta función toma un archivo de correo electrónico HTML y lo convierte en una cadena Javascript. La generación de correos electrónicos HTML es un poco diferente de los archivos HTML, como se explica en este gran artículo de mailchimp. Luego utilicé un generador de cadenas de HTML a Javascript para devolver la cadena en el campo Email.create que se utiliza como HTML para el correo electrónico de nodemailer. Paso el objeto req de la función Sesión.makeVerification a esta función, para que pueda generar la URL que se utilizó para acceder a la página. De esta forma, si alguien cambiara el dominio del sitio, o la dirección IP en la que estaba realizando la prueba, se generaría de forma consistente la URL correcta para el correo electrónico de verificación. El lugar donde se cambia esta URL es el 'href' para el botón 'Verificar' de la página HTML, de modo que cuando hagan clic en el enlace, se les envíe a la URL de su ID de verificación en /api/verify/:verificationID. Puede ver esta API en el rutas/routes.js archivo.
API '/api/verify/:verificationID
A través de esta función, finalmente enviamos la verificación de correo electrónico, por lo que el usuario deberá verificar el correo electrónico antes de poder acceder a su cuenta. El botón de verificación de correo electrónico del usuario lo vinculará a la api/verify/:verificationID donde la API tomará el ID de verificación, como req.params.verificationID. A continuación, enviará esto a una función llamada Sesión.verificar en modelos/sessionmodel.js. Esta función toma este verificationID, y comprueba que existe. A continuación, cambia el estado del documento de usuario del usuario asociado, y establece su atributo 'login.emailVerified' a true, permitiendo al usuario iniciar sesión. Finalmente, borra el documento de verificación completando el proceso de registro y configurando la aplicación para permitir al usuario iniciar sesión.
Función "Session.verify
Para resumir, cubrimos cómo Touchbase genera documentos para el proceso de verificación de correo electrónico, genera el correo HTML para el usuario y luego actualiza el perfil del usuario una vez que la verificación ha sido completada. Si tiene alguna pregunta o comentario, por favor coméntelo a continuación.