‫Instructor: En este video y en los
‫siguientes, implementaremos una funcionalidad de
‫restablecimiento de contraseña fácil de usar, que es una especie de
‫estándar en la mayoría de las aplicaciones web.
‫Y probablemente, haya utilizado el restablecimiento de contraseña
‫en algún sitio web antes y, por
‫lo general, funciona así.
‫Solo tiene que proporcionar su dirección
‫de correo electrónico y luego recibirá un correo
‫electrónico con un enlace donde puede hacer clic y
‫luego lo llevará a una página donde puede ingresar una nueva contraseña.
‫Este es un procedimiento muy estándar y así
‫es como lo implementaremos aquí
‫en esta aplicación.
‫Básicamente hay dos pasos.
‫La primera es que el usuario envía una solicitud de
‫publicación a una ruta de contraseña olvidada, solo con esta dirección de correo electrónico.
‫Esto luego creará un token de restablecimiento
‫y lo enviará a la dirección de correo electrónico que se proporcionó.
‫Solo un token simple y aleatorio, no un token web JSON.
‫Esa es una diferencia aquí.
‫Luego, en la segunda parte, que será
‫el siguiente video, el usuario envía ese token desde su
‫correo electrónico junto con una nueva contraseña para actualizar su contraseña.
‫Básicamente, tendremos exportaciones. Olvidé la contraseña, que es el
‫primer paso.
‫Así que solicite, responda y luego y luego como segundo
‫paso, hemos restablecido la contraseña.
‫Entonces, sigamos adelante e implementemos estas dos rutas.
‫De acuerdo, y eso es, por supuesto, en su enrutador de usuario o en
‫el archivo de rutas de usuario.
‫Pongámoslos también aquí y,
‫de hecho, puedo duplicar estas líneas aquí.
‫Así que hemos vuelto a olvidar la
‫contraseña, que solo recibirá
‫la dirección de correo electrónico y luego restablecerá la contraseña,
‫que recibirá el token y la nueva contraseña.
‫Este es el
‫que vamos a empezar a implementar en esta conferencia.
‫Como antes, especifiquemos nuestros pasos aquí.
‫Entonces, primero, obtenga el usuario según
‫el correo electrónico publicado
‫y luego genere el token aleatorio.
‫Y luego, básicamente, envíelo de vuelta como un correo electrónico.
‫Esto es bastante común para nosotros en este momento.
‫Entonces, usuario, esperemos que el usuario encuentre un punto y ahora
‫busque uno, no busque por
‫id porque no conocemos el id del usuario.
‫Y el usuario, por supuesto, tampoco conoce su propia identificación, por
‫lo que especificamos la dirección de correo electrónico.
‫Básicamente, es el único dato que se conoce.
‫Y eso es stand on request dot body dot dirección de correo electrónico.
‫Y, por supuesto, ahora tenemos
‫que decir que estamos en una función asíncrona y luego, como antes,
‫envuélvala en catch async.
‫Déjelo guardar y el error desaparecerá.
‫Luego, el siguiente paso, verifiquemos
‫si el usuario existe.
‫Entonces, si no hay usuario, regrese al siguiente middleware
‫junto con un nuevo error.
‫No es ningún usuario con esa dirección de correo electrónico.
‫Y luego podemos poner un 404, que como ya
‫sabéis, significa no encontrado.
‫A continuación, generemos el token aleatorio y para
‫eso, una vez más,
‫crearemos un método instantáneo en el usuario.
‫Porque una vez más, esto realmente tiene que ver con
‫los datos del usuario en sí.
‫Y vamos a escribir un poco de
‫código realmente, así que, si fuera solo una línea
‫de código, entonces, por supuesto, podríamos ponerlo aquí.
‫Pero necesitamos un par de líneas
‫de código y, de nuevo, es un poco
‫más limpio separarlo en su propia función.
‫Y eso por lo general con Mongoose es mejor como método instantáneo.
‫Así que aquí abajo, editemos aquí al final.
‫Por lo tanto, los métodos de punto de esquema de usuario crean un token de restablecimiento de contraseña.
‫Un nombre bastante largo y descriptivo.
‫Me gusta hacerlo así,
‫para saber exactamente a qué me enfrento.
‫El token de restablecimiento de contraseña debería ser básicamente una cadena aleatoria
‫pero, al mismo tiempo, no
‫necesita ser tan criptográficamente seguro como el hash de contraseña
‫que creamos antes.
‫Podemos usar la función de bytes aleatorios muy
‫simple del módulo criptográfico incorporado.
‫Sigamos adelante y agreguemos eso.
‫Crypto requiere y nuevamente, es un módulo de nodo incorporado, por lo que
‫no es necesario instalar nada.
‫Frio.
‫Ahora, generemos nuestro token.
‫Y para eso, usamos bytes aleatorios de puntos criptográficos y
‫luego aquí necesitamos especificar la cantidad de
‫caracteres básicamente.
‫Y luego también al final,
‫lo convertimos en una cadena hexadecimal.
‫Dos
‫cadenas y luego podemos especificar la opción hexadecimal aquí.
‫Ahora, si se
‫está preguntando por qué estamos
‫creando este token, supongo que todavía no lo he explicado.
‫Básicamente, este token es lo que le
‫enviaremos al usuario, por lo que es como una contraseña de
‫restablecimiento que el usuario puede usar para crear una nueva contraseña real.
‫Y, por supuesto, solo el usuario tendrá acceso a este token.
‫Y así, de hecho, realmente se comporta como una contraseña.
‫Dado que esencialmente es solo una contraseña, significa que
‫si un pirata informático puede acceder a nuestra base de datos, entonces
‫eso le permitirá al pirata informático obtener acceso
‫a la cuenta estableciendo una nueva contraseña.
‫Si simplemente almacenamos este token de restablecimiento en
‫nuestra base de datos ahora, entonces, si algún atacante obtiene acceso a
‫la base de datos, podría usar ese
‫token y crear una nueva contraseña usando ese token en
‫lugar de hacerlo usted.
‫Entonces controlarían efectivamente su cuenta en lugar de
‫que usted lo haga.
‫Al igual que una contraseña, nunca deberíamos almacenar
‫un token de restablecimiento simple en la base de datos.
‫En realidad, vamos a
‫cifrarlo, pero como antes con la
‫contraseña, no necesita un método de cifrado tan
‫fuerte criptográficamente.
‫Porque estas fichas de reinicio son un vector de
‫ataque mucho menos peligroso.
‫Nuevamente, solo usaremos el módulo
‫criptográfico incorporado.
‫Funciona de esta forma extraña.
‫Decimos cripto, luego crea hash con el
‫algoritmo sha 256, luego necesitamos decir actualización
‫y luego
‫variable donde se almacena el token.
‫Cualquier cadena que queramos cifrar básicamente.
‫Y luego tenemos que decir digerir y luego almacenarlo
‫nuevamente como hexadecimal.
‫¿Y ahora dónde vamos a guardar realmente este token de reinicio?
‫Bueno, crearemos un nuevo campo en nuestro esquema de base de datos.
‫Porque, por supuesto, queremos guardarlo en la base de
‫datos, para luego compararlo
‫con el token que proporciona el usuario.
‫Hagámoslo aquí al final.
‫Token de restablecimiento de contraseña, esa
‫es la cadena.
‫Y luego también expira el restablecimiento de contraseña.
‫Porque este restablecimiento caducará
‫después de un cierto período de tiempo como medida de seguridad.
‫Solo tendrá 10 minutos para restablecer
‫su contraseña.
‫Ahora sigamos adelante y usemos estos.
‫Este token de restablecimiento de contraseña de punto es igual a
‫este cifrado.
‫A continuación, establezcamos el vencimiento del restablecimiento de contraseña y
‫establezcamos ese punto de fecha ahora y luego simplemente agregue un
‫par de segundos a eso.
‫Queremos que funcione durante 10
‫minutos y eso es 10 y luego lo necesitamos en milisegundos.
‫Veces 60 por segundos y luego 1000 por milisegundos.
‫Y luego también quiero devolver el token de texto sin formato porque
‫en realidad es el que enviaremos a través
‫del correo electrónico.
‫Devuelve el token de reinicio.
‫Necesitamos enviar por correo electrónico el
‫token de reinicio sin cifrar porque, de lo
‫contrario, no tendría mucho sentido cifrarlo en absoluto.
‫Si el token que
‫estaba en la base de datos fuera exactamente
‫el mismo que podríamos usar para
‫cambiar la contraseña, entonces eso no sería ningún cifrado.
‫Enviamos un token por correo electrónico
‫y luego tenemos la versión encriptada en nuestra base de datos.
‫Y ese cifrado es básicamente inútil para
‫cambiar la contraseña.
‫Es como cuando guardamos
‫solo la contraseña encriptada en la
‫base de datos, tal como lo hicimos aquí,
‫así que encriptamos la contraseña usando bcrypt.
‫Tenga en cuenta que los únicos datos confidenciales
‫que se guardan en forma encriptada y luego
‫se comparan con la versión encriptada que está en la
‫base de datos.
‫Eso es solo registrar estos dos
‫en la consola que hará nuestras vidas un poco más fáciles en el futuro.
‫Digamos restablecer token y estoy iniciando sesión aquí
‫como un
‫objeto porque de esta manera, me dirá el nombre
‫de la variable junto con su valor.
‫Y luego lo mismo con este token de restablecimiento de contraseña de punto.
‫Este realmente no funciona con
‫objetos de escritura, esta nueva forma de
‫ES6 y dejémoslo así.
‫De todos modos, regresemos
‫aquí y luego usemos esa función.
‫Así que recuerde cómo devolvimos el token de
‫reinicio y almacénelo aquí.
‫Entonces, el token de reinicio es igual al conjunto de puntos del usuario y ya
‫no estoy seguro del nombre.
‫Cree un token de restablecimiento de contraseña, por
‫lo que es largo.
‫Está bien y eso está hecho,
‫pero en realidad lo que hicimos fue modificar
‫los datos aquí.
‫Cuando configuramos este punto, la contraseña expira, por ejemplo,
‫a este valor, de hecho no
‫actualizamos realmente el documento.
‫No lo salvamos.
‫Realmente solo lo
‫modificamos, pero ahora necesitamos guardarlo.
‫Digamos que esperar al usuario a guardar.
‫Pero observe lo que sucede ahora que usamos esto.
‫Tomemos este de aquí.
‫Esta es la ruta que encontramos antes.
‫Y ahora tenemos esta ruta que aún no está definida.
‫Veamos por qué es así.
‫En la ruta del usuario, claramente tenemos la misma URL aquí, pero
‫veo que en realidad necesitamos hacer una solicitud de publicación.
‫De acuerdo, de acuerdo, pero ahora recibimos un error que dice que
‫proporcione un correo electrónico y una contraseña.
‫Y eso es lo que quise decir cuando dije
‫que observa lo que sucede cuando intentas esto.
‫Eso sucede porque estamos tratando de guardar un documento,
‫pero no especificamos todos los datos obligatorios, por lo que
‫los campos que marcamos como obligatorios.
‫Arreglemos eso rápidamente.
‫Todo lo que tenemos que hacer es pasar una opción especial
‫a este método de guardado de puntos de usuario.
‫Decimos
‫validar antes de guardar
‫establecido en falso.
‫Esto luego desactivará todos los validadores que
‫especificamos en nuestro esquema.
‫Son estas pequeñas cosas que necesita saber las
‫que marcarán la diferencia.
‫Ahora bien, tampoco sabía realmente que esto existía
‫porque nadie realmente sabe todas las cosas.
‫Es imposible.
‫Una biblioteca como Mongoose es simplemente demasiado grande para que
‫sepas todo lo que hay.
‫Seguí adelante y leí la documentación de
‫Mongoose y ahí es donde encontré esta opción extremadamente útil.
‫Todo esto solo para decirlo de nuevo, nadie
‫lo sabe todo y, por
‫lo tanto, es un buen hábito
‫que, si tiene
‫algún problema, eche un vistazo a
‫la documentación de la biblioteca que está utilizando.
‫Echemos un vistazo a esto ahora.
‫Y todavía recibimos el mismo error aquí, pero veo aquí
‫abajo que en realidad proviene
‫de la función de inicio de sesión.
‫Echemos un vistazo a lo que está pasando aquí.
‫Echemos un vistazo también a las rutas.
‫Ah, está bien, aquí está el problema.
‫Ahora estamos intentando llamar al controlador
‫de inicio de sesión, lo que, por supuesto, no tiene sentido.
‫Aquí está la contraseña olvidada.
‫Aquí está restablecer la contraseña.
‫Entonces, el error que obtuvimos antes en realidad no se debió
‫a la validación.
‫Enviemos esto de nuevo y ahora
‫recibimos el error de que no hay ningún
‫usuario con esta dirección
‫de correo electrónico y eso es porque no especificamos ninguna
‫dirección de correo electrónico en el cuerpo.
‫Lo probamos y
‫ahora es el momento de probarlo con
‫un correo electrónico de usuario.
‫Está bien.
‫Y ahora no debería
‫hacer nada porque no estamos enviando ninguna respuesta.
‫Cancelemos esto porque
‫todo lo que realmente me
‫interesó es ver estos tokens aquí y luego
‫también echar un vistazo al objeto de usuario.
‫Este es el token de reinicio original, por lo
‫que verá que es una cadena hexadecimal aleatoria
‫y luego tenemos el cifrado aquí.
‫Este recuerdo es el que no debería estar en la base de
‫datos, por lo que termina en a901.
‫Echemos un vistazo a eso.
‫Y de hecho, aquí está,
‫el token de restablecimiento de contraseña que termina en este a901.
‫Y también la fecha, que de hecho es de 10 minutos a partir de ahora.
‫Ahora sabes a qué hora estoy grabando este video.
‫De todos modos, pero esto funcionó bien.
‫Y esta es en realidad la primera
‫parte de la creación de esta funcionalidad de restablecimiento de contraseña.
‫En el siguiente video,
‫enviaremos este token aquí por correo electrónico al usuario y,
‫de hecho, preparamos un video separado solo
‫para aprender cómo enviar correos electrónicos con node
‫a js.
‫Es muy divertido,
‫así que no espere para mudarse allí de inmediato.