‫-: Entonces, anteriormente, ya implementamos
‫una funcionalidad de registro simple, pero
‫en esta
‫lección, también registraremos al usuario para
‫que realice un proceso de registro más real.
‫Entonces, a partir de esta
‫lección, realmente comenzaremos a implementar nuestra autenticación, y
‫aquí es donde se pone realmente serio.
‫Y, por lo tanto, antes de
‫comenzar, quiero darle una advertencia
‫aquí, por lo que la autenticación es muy difícil de
‫hacer bien y hay muchos tutoriales que
‫encontrará cuando busque autenticación
‫con like Node. js y
‫Express, muchos de estos cometen muchos errores
‫graves y simplifican demasiado cosas que no deberían simplificarse.
‫De acuerdo, esto no quiere decir que todos los
‫tutoriales sean malos,
‫estén bien o que sean
‫inútiles o algo así, pero realmente paso semanas investigando todas las mejores
‫prácticas y refinando y mejorando mi código,
‫para hacer esta sección de
‫autenticación que nosotros Vamos a empezar a implementar ahora
‫de la mejor manera posible, para un
‫principiante como tú, de acuerdo, y eso se debe a
‫que debemos tener mucho cuidado al escribir esta parte de la
‫aplicación, porque recuerda, los datos de nuestro usuario están en juego
‫aquí. y la confianza en la empresa que ejecuta
‫la aplicación también está
‫en juego, por lo que
‫implementar la autenticación es una responsabilidad
‫real en la que no debe cometer ningún error.
‫Ahora hay algunas bibliotecas
‫que pueden ayudarnos a implementar la autenticación
‫y la autorización y la más conocida se
‫llama Passport, pero incluso una
‫biblioteca como esa
‫no le quita todo el trabajo y
‫toda la responsabilidad, de acuerdo.
‫Ahora, en este
‫caso, vamos a implementar toda la
‫lógica de autorización y protección de inicio de sesión por nosotros
‫mismos, excepto, por supuesto, la implementación del token web de Jason
‫de la que hablamos en el último video.
‫Bien, entonces toda la firma y verificación,
‫todo eso, lo dejaremos en la biblioteca de WJT,
‫pero luego el resto, lo
‫implementaremos nosotros mismos en las próximas conferencias.
‫Ahora, como mencioné anteriormente,
‫ya tenemos nuestra función de registro aquí, correcto, pero ahora
‫mismo, todo lo
‫que hace es simplemente crear un nuevo
‫usuario y luego enviarlo de vuelta al cliente.
‫Ahora, poco después de terminar de grabar este curso,
‫noté que
‫hay una falla de seguridad muy
‫seria en esta forma de registrar
‫usuarios, así que básicamente el problema es
‫que ahora mismo, creamos un nuevo usuario usando todos los
‫datos que ingresan. el cuerpo
‫correcto, por lo que el problema aquí es que
‫así, cualquiera puede especificar el rol como un derecho de administrador, así
‫que básicamente, ahora todos pueden simplemente registrarse como administradores en nuestra
‫aplicación, y eso,
‫por supuesto, no es lo que necesitamos.
‫De nuevo, esta es una falla de seguridad grave
‫y, por supuesto, tendremos que solucionarla y,
‫en realidad, corregirla es bastante simple.
‫Entonces, lo que necesita en lugar de esta línea
‫de código, que se selecciona
‫aquí, es este fragmento de código que acabo de poner aquí en la pantalla.
‫Bueno.
‫Entonces, nuevamente, continúe y elimine esta línea de código que está
‫actualmente seleccionada aquí y reemplácela
‫con el código que acabo de poner aquí
‫en la pantalla.
‫Ahora, ¿cuál es realmente la gran diferencia
‫aquí? Bueno, con este
‫nuevo código, básicamente solo permitimos que los datos que realmente necesitamos
‫se ingresen en el nuevo usuario,
‫así que solo un nombre, el correo electrónico y luego las contraseñas.
‫Y ahora, incluso si un usuario intenta ingresar manualmente un rol, no
‫lo almacenaremos en el nuevo usuario, y lo
‫mismo ocurre con otras
‫cosas, como por ejemplo, una foto.
‫Entonces, esta es la solución rápida y fácil para ese problema.
‫Ahora,
‫lo que hará esto es que ya no podemos registrarnos
‫como administradores, por lo que si necesitamos
‫agregar un nuevo
‫administrador a nuestro sistema, podemos simplemente crear un nuevo
‫usuario normalmente y luego ir a
‫MongoDB Compass, y básicamente editar ese rol allí.
‫Así que edítelo
‫de usuario a administrador manualmente, está bien.
‫Por supuesto, también podríamos definir una
‫ruta especial solo
‫para crear administradores, pero eso sería demasiado.
‫Bien, sigamos ahora.
‫Solo tenga en cuenta que el código en el
‫resto del video y todos los
‫videos en este curso, por supuesto, seguirá siendo esta versión antigua incorrecta, está bien,
‫pero en realidad en el código final
‫que está en el repositorio
‫de GitHub, ya lo arreglé y nosotros tener el código correcto allí.
‫De todos modos, por lo general, cuando nos registramos en cualquier
‫aplicación web, también inicia sesión automáticamente, ¿verdad? Así
‫que impleméntalo muy rápidamente aquí.
‫Así que inicie sesión con el
‫nuevo usuario, tan pronto como se haya registrado, está
‫bien, y recuerde de la lección
‫anterior, cómo funciona eso, bueno,
‫todo lo que realmente tenemos
‫que hacer es firmar un token
‫web de Jason y luego enviárselo al usuario. , está
‫bien, pero primero instalemos el paquete MPM que usaremos
‫para todo lo relacionado con los tokens
‫web de Jason.
‫Entonces, en nuestra otra terminal, digamos
‫que la instalación de MPM, Jason web token, así que todo esto junto
‫de esta manera y
‫luego debería instalar este paquete y, de
‫hecho, sigamos
‫adelante y echemos un vistazo en GitHub,
‫solo para ver la documentación
‫y haz eso
‫aquí, ya no necesitamos este aquí al
‫menos por ahora, por lo que esto nos llevará a la página sobre MPM,
‫y para que veas
‫lo popular que es este
‫paquete, tenemos 2. 3 millones de descargas
‫semanales, por lo que realmente son un montón de
‫descargas y también podemos echar un vistazo a
‫la documentación aquí, pero personalmente prefiero hacerlo en GitHub.
‫Creo que se ve mucho más limpio aquí,
‫y estoy tan acostumbrado a
‫él en este punto, por lo que generalmente lo veo aquí, está bien.
‫De todos modos, la primera función que
‫usaremos con JWT aquí es firmar, está bien, así que
‫para básicamente crear un nuevo token, y para eso, por
‫supuesto, necesitamos la carga útil, necesitamos
‫la clave para ese secreto privado que mencioné.
‫antes, eso
‫solo está almacenado en nuestro servidor y
‫necesitamos firmar el token y
‫luego podemos pasar algunas opciones y
‫haremos todo eso en un segundo,
‫solo quiero mostrar la otra función que tenemos aquí,
‫y que realmente tenemos un montón de opciones
‫aquí, por ejemplo, el expira en,
‫que usaremos para usar también, así
‫que todas estas cosas
‫y luego tenemos que verificar.
‫Así que también hablamos sobre el proceso de
‫verificación y eso está básicamente implementado en esta función, está bien,
‫y este es el que
‫usaremos, cuando inicie sesión como usuario, está bien, y eso
‫es todo lo que hay,
‫así que tienes todo estas opciones
‫diferentes aquí, está bien,
‫también tienes decodificación pero esa no es realmente
‫importante, está bien, entonces ves que este paquete realmente
‫solo incluye
‫las dos funcionalidades que discutimos en el video anterior.
‫Entonces firmando y luego verificando, está bien.
‫Así que volvamos aquí y comencemos
‫a usar el paquete de tokens web de Jason.
‫Así que importémoslo
‫aquí, y generalmente se llama simplemente
‫JWT y requiere el token web de Jason.
‫De acuerdo, creemos nuestro token aquí, de acuerdo, y
‫me gustaría simplemente
‫llamarlo así, así que solo token, de acuerdo, luego
‫el signo de punto JWT, y ahora lo primero es la carga útil,
‫y esto es básicamente un objeto para
‫todos. los datos que vamos a
‫almacenar dentro del token, y en este caso,
‫realmente
‫solo queremos la identificación del usuario, de acuerdo, así que
‫no hay nada loco aquí, no muchos datos
‫que no sean realmente importantes.
‫Entonces decimos que la ID es y luego
‫simplemente obtenemos la ID del nuevo usuario
‫que se acaba de crear, de acuerdo, entonces el
‫nuevo usuario marca el punto y luego recuerda que en MonogoDB, la ID en
‫realidad se llama ID de subrayado, de acuerdo, y entonces es
‫el objeto que son los
‫datos, la carga útil, que queremos poner en nuestro JWT.
‫A continuación, necesitamos el secreto, está bien, básicamente
‫una cadena para
‫un secreto, está bien, por
‫supuesto, esto es terrible, está bien, esto es una
‫especie de marcador de posición
‫porque en realidad, nuestro archivo de configuración
‫es un lugar perfecto para almacenar este tipo de datos secretos, así
‫como la contraseña, por ejemplo, y vamos a
‫agregar y editar aquí, de acuerdo, así que llamémoslo JWT, secreto y,
‫por supuesto, el nombre que le damos aquí, realmente no importa, pero lo
‫que importa es el secreto que
‫especificamos aquí,
‫de acuerdo, porque usando el cifrado estándar HSA 256 para
‫la firma, el secreto debe tener al menos treinta y dos caracteres, de acuerdo, pero
‫cuanto más largo, mejor en realidad y aquí es donde
‫muchos los tutoriales fallan, algunos de ellos
‫simplemente colocan una cadena muy corta
‫aquí, pero eso no es ideal nuevamente,
‫así que para el mejor cifrado de la firma,
‫nuevamente debes usar al
‫menos treinta y dos caracteres, así
‫que voy a crear mi secreto aquí ahora pero realmente deberías
‫usar otro, está bien,
‫por favor no uses el sa yo uno como
‫lo estoy haciendo porque eso podría convertirse en
‫un problema de seguridad para su
‫aplicación, está bien, siempre
‫use un secreto único para sus aplicaciones y nunca el
‫mismo, está bien, y especialmente
‫no el de otra persona, así que definitivamente
‫no es el que yo Estoy escribiendo ahora.
‫Entonces esto
‫puede ser cualquier cosa, no tiene
‫por qué ser personajes raros
‫o cosas así, prefiero usar
‫una frase como esta, mi secreto ultra seguro
‫y ultra largo,
‫entonces, ¿qué pasó aquí? este es el
‫que
‫usaremos para mis tokens web de
‫Jason, pero nuevamente, use otro, de acuerdo.
‫De todos modos, volvamos al controlador de autenticación aquí,
‫y ahora utilícelo.
‫Así que recuerde que una variable
‫de entorno es proceso punto final punto JWT secreto, de
‫acuerdo.
‫Entonces, en este punto, tenemos la carga
‫útil y tenemos el secreto.
‫El encabezado del token se creará automáticamente, pero ahora
‫lo que
‫también podemos hacer es pasar
‫algunas opciones, y la opción que
‫voy a pasar es cuándo debería expirar el JWT.
‫Entonces, esto significa que después del tiempo
‫que vamos a pasar aquí,
‫el token web de Jason ya
‫no será
‫válido, incluso si de lo contrario se verificaría correctamente,
‫de acuerdo, así que
‫esto es básicamente para cerrar la sesión de
‫un usuario después de un cierto período
‫de tiempo simplemente como medida de seguridad, de acuerdo.
‫Así que definamos ese tiempo de vencimiento también como
‫una variable de configuración
‫aquí, por lo que JWT caduca y aquí, por supuesto, puede
‫usar el mismo tiempo que
‫estoy poniendo.
‫Entonces podemos usar una
‫cadena especial como, por ejemplo, 90D y
‫el algoritmo de firma se dará cuenta
‫automáticamente de que esto significa noventa días, está bien, también
‫podría usar como diez horas o cinco minutos o tres segundos o algo así,
‫o simplemente cualquier número , que
‫luego se
‫tratará como milisegundos, pero creo que es
‫mejor simplemente usar noventa o algo
‫D, así que en este caso, noventa días, está bien,
‫y nuevamente, después de
‫noventa días, el JWT ya no será
‫válido, incluso si la firma es correcta y todo es válido.
‫De acuerdo, de nuevo, como una medida de seguridad
‫adicional,
‫de acuerdo, estas opciones, como siempre, las pasamos
‫como un objeto y luego especificamos
‫el expira en, entonces expira en y luego procesamos punto final y
‫luego JWT expira en, de acuerdo, y esto aquí agregará algunos datos
‫adicionales a la carga útil,
‫pero eso, por
‫supuesto, no es ningún problema.
‫Así que acabamos de crear un token,
‫ahora todo lo que
‫tenemos que hacer es enviárselo al cliente.
‫Así que pongámoslo aquí ante el usuario
‫y eso es todo.
‫Eso es realmente todo lo que tenemos que hacer
‫para iniciar sesión como un
‫nuevo usuario, porque en
‫este momento no estamos verificando si alguna contraseña es correcta
‫o si el usuario
‫realmente existe en la base de
‫datos porque
‫aquí, en este caso, el usuario
‫fue realmente creado y así que de
‫inmediato, registramos al usuario en la
‫aplicación enviando un token, está bien, y el uso
‫del cliente debería almacenar ese token de alguna
‫manera, tal como lo
‫mencionamos antes en la lección anterior, está bien, así que vamos a guardarlo aquí, y
‫probémoslo, de acuerdo, así que déjanos mi antigua dirección
‫aquí, hola @ jonas. io, enviémoslo y esperemos
‫y, de hecho, aquí está nuestro
‫token web de Jason, así que enhorabuena, acaba de crear su
‫primer token web de Jason, que
‫debería verse un poco así, y por
‫supuesto no se verá exactamente igual.
‫Lo mismo, porque nuestro secreto tampoco es
‫el mismo, cierto, y ahora lo que quiero mostrarles
‫es el depurador
‫JWT, que les mostré como captura
‫de pantalla anteriormente en el
‫último video.
‫Así que sigamos y copiemos
‫este token y luego vayamos a JWT. io, está bien, entonces
‫aquí
‫abajo tenemos el depurador,
‫así que eliminemos este aquí, y coloquemos el nuestro
‫y de inmediato verá que nuestra
‫firma no es válida, pero eso
‫es porque la función de signo edita
‫estas dos propiedades
‫aquí, porque especificamos un vencimiento fecha básicamente.
‫Entonces, esto aquí se emite en,
‫y este es el tiempo de vencimiento,
‫está bien, si eliminamos estos dos de aquí, verá que
‫ahora, esta
‫firma está realmente verificada, está bien,
‫así que lo que es importante notar aquí es que,
‫por supuesto, el encabezado es visible, está
‫bien, básicamente es fácilmente decodificable, por lo que
‫no especificamos nada de esto, fue el paquete
‫de token web de Jason el que lo hizo por
‫nosotros, pero aquí está la carga útil que especificamos, así que
‫si echamos un vistazo en este
‫ID, debería ser exactamente el mismo que tenemos
‫en cartero, por lo que termina en
‫seis OF, y de hecho, es exactamente el mismo derecho,
‫está bien, entonces estos dos aquí están
‫abiertos y luego la firma, por supuesto, no podemos realmente
‫veo, porque, por supuesto, nuestro secreto es solo
‫eso, es realmente secreto, está bien, así que esto
‫fue solo para mostrarles que todo funciona, y cerremos
‫esto, y sí, no
‫podemos iniciar sesión en los usuarios, pero solo si el usuario acaba
‫de registrarse, porque en ese caso, no
‫necesitamos verificar el correo electrónico en la base
‫de datos, y
‫tampoco el contraseña, está bien.
‫Entonces, hacer todo eso es un proceso mucho más complejo,
‫y eso es lo que haremos
‫en la próxima lección,
‫así que a continuación, iniciaremos la sesión de los
‫usuarios, según su dirección de correo electrónico y su contraseña.