‫Narrador: Hasta ahora, en nuestra implementación de
‫autenticación, hemos registrado a los usuarios con una contraseña correcta.
‫Básicamente, completamos este primer paso del flujo de trabajo de
‫autenticación en el que
‫se crea un token web JSON y
‫se envía de vuelta al cliente si el usuario
‫proporciona un correo electrónico y una contraseña correctos.
‫A continuación, implementaremos rutas protegidas.
‫Básicamente, se utiliza el token web JSON
‫creado para dar acceso a los usuarios registrados a rutas protegidas.
‫Y este es el segundo paso de la autenticación.
‫Y entonces, sigamos adelante e implementemos esta funcionalidad.
‫Entonces, digamos que queríamos proteger
‫la ruta getAllTours.
‫Básicamente, solo permite que los usuarios registrados
‫tengan acceso a una lista de todos nuestros recorridos.
‫Y lo que significa es que antes de
‫ejecutar el controlador get all tours,
‫echemos un vistazo a eso.
‫Bien, entonces antes de ejecutar este identificador aquí,
‫necesitaríamos tener alguna verificación para
‫verificar si el
‫usuario está realmente conectado o no, ¿verdad?
‫Entonces, la mejor manera de
‫hacer eso, como probablemente ya sabe
‫en este punto, es usar una función de middleware, ¿de acuerdo?
‫Entonces, en este video, para proteger
‫las rutas, crearemos una función de middleware
‫que se ejecutará antes de cada uno de estos controladores, está bien.
‫Entonces, una función que se ubicará
‫aquí, antes de que esta función pueda ejecutarse.
‫Y este middleware devolverá un error si
‫el usuario no está autenticado, por
‫lo que si no
‫ha iniciado sesión, o llamará
‫al siguiente middleware, que en este caso es el controlador getAllTours, ¿verdad?
‫Y eso que eficaz protege esta
‫ruta del acceso no autorizado.
‫Así que sigamos adelante y creemos
‫rápidamente esa función de
‫middleware y luego
‫pongámosla aquí para ilustrar lo que acabo de decir.
‫Bien, aquí en nuestro controlador de autenticación de
‫nuevo crearemos una nueva función de
‫middleware y se llama proteger.
‫Muy bien,
‫y al igual que antes, voy a
‫usar catchAsync porque una vez más todas estas
‫funciones son funciones asíncronas en realidad.
‫Muy bien, y luego aquí, por supuesto, nuestra función
‫de middleware y, por ahora, simplemente llamemos al
‫siguiente aquí solo para que tengamos cualquier cuerpo
‫aquí en esta función
‫de middleware y luego regresemos a nuestras
‫rutas turísticas y luego protejamos esta ruta, de acuerdo. ?
‫Entonces, en primer lugar, necesito realmente requerir este
‫módulo de controlador de autenticación.
‫Entonces
‫const y luego requiera que
‫esté en controladores, y
‫luego authController, está bien.
‫Así que ahora conectémoslo,
‫aquí mismo en la ruta getAllTours.
‫Bueno.
‫Entonces authController. proteger.
‫Bueno.
‫Y ahora, esta función de middleware se ejecutará primero
‫y nuevamente, si el usuario no está autenticado, habrá
‫un error.
‫Y, por supuesto, el próximo middleware,
‫por lo que el
‫que realmente recibe y envía todos los recorridos no se ejecutará.
‫Bueno.
‫Y nuevamente, esto protegerá efectivamente el acceso a
‫este recurso aquí de los usuarios que no están conectados.
‫Muy bien, regresemos aquí.
‫No las rutas del
‫usuario, sino el controlador de autenticación.
‫Muy bien, y ahora sobre la implementación de este
‫middleware de protección.
‫¿Qué tendremos que hacer exactamente?
‫Bueno, comencemos por delinear un par de pasos aquí.
‫De acuerdo, y en primer lugar, debemos marcar
‫esta función como Async, de lo contrario,
‫no necesitaríamos catchAsync, ¿verdad?
‫Y verá por qué necesitamos que esto sea una función Async
‫en un segundo, ¿de acuerdo?
‫Pero ahora expongamos los pasos que
‫debemos seguir para implementar este middleware de protección.
‫Así que, al igual
‫que antes, pondré estos pasos aquí como comentarios.
‫En primer lugar, necesitamos obtener el token.
‫Y
‫verifique si está ahí básicamente,
‫así que verifique si existe.
‫Luego, a continuación, debemos validar el token.
‫Y este es básicamente ese paso
‫súper importante del que hablamos antes, donde el algoritmo JWT verifica si
‫la firma es válida o
‫no.
‫Entonces, si el token es válido o no, ¿de acuerdo?
‫Entonces, en realidad, llamemos a esto aquí verificación.
‫Creo que así lo llamamos en esa diapositiva en la
‫que hablamos de esto antes, de acuerdo.
‫Y si realmente no recuerdas cómo funcionó, bueno,
‫siempre puedes volver
‫atrás y volver a ver esa conferencia, ¿de acuerdo?
‫Luego, a continuación, si la verificación fue realmente exitosa, también debemos verificar
‫si el usuario que está tratando de acceder
‫a la ruta todavía existe, ¿de acuerdo?
‫Así que verifique si el usuario todavía existe, y hablaré más
‫sobre por qué cada uno
‫de estos pasos es necesario una vez que comencemos a implementarlos, ¿de acuerdo?
‫Entonces, por ahora, esto puede no tener mucho sentido
‫para usted, pero nuevamente hablaré sobre cada parada una vez que lleguemos allí.
‫¿Está bien?
‫Y finalmente también debemos verificar
‫si
‫el usuario cambió la
‫contraseña después de que
‫se emitió el JWT, ¿de acuerdo?
‫Bueno, digamos token aquí, lo
‫llamamos token en todos los demás lugares, ¿de acuerdo?
‫Y solo si no hubo problemas
‫en ninguno de estos pasos
‫aquí, solo entonces, por supuesto, se llamará a continuación, que
‫luego tendrá acceso a la ruta que protegemos.
‫Entonces, en nuestro ejemplo actual, nuevamente, este controlador getAllTours.
‫¿Derecha?
‫Bien, pero retrocedamos
‫y comencemos a implementar nuestro primer paso aquí.
‫Básicamente, obtener el token
‫y luego verificar si realmente existe.
‫Entonces, una práctica común es enviar un token usando un encabezado http
‫con la solicitud, ¿de acuerdo?
‫Entonces, echemos un vistazo a cómo podemos configurar encabezados en Postman
‫para enviarlo junto con la
‫solicitud y luego también cómo podemos obtener
‫acceso a estos encabezados en Express.
‫Y vamos a hacer eso primero.
‫Así que aquí en apt. js Creo que tenemos este buen middleware
‫aquí, por lo que aquí vamos a iniciar sesión en
‫la solicitud de la consola. encabezados, Bien, ya
‫hablamos de encabezados http antes, y así
‫es como podemos acceder a ellos en Express.
‫Bien, básicamente a los encabezados de solicitud, es decir,
‫los que un cliente puede enviar junto con su solicitud.
‫Bien, y aquí en Postman, ahora vayamos a la
‫ruta que en realidad estamos tratando de proteger.
‫Y luego aquí establece un encabezado.
‫Y hagamos una
‫prueba y configurémoslo en jonas, ¿de acuerdo?
‫Ahora solo enviaré
‫esto y aquí en Express, echemos un vistazo a eso.
‫Y, de hecho, aquí obtenemos un objeto con todos los encabezados
‫que forman parte de la solicitud.
‫Así que todo esto aquí.
‫Y ves que hay un montón de
‫encabezados que Postman envía automáticamente junto con la
‫solicitud, por ejemplo, dice que el usuario-agente es Postman, también
‫envía el host, y algunos otros
‫de los que hablaremos más adelante, como
‫aceptar por ejemplo.
‫Ahora, lo que importa aquí es en realidad el
‫encabezado que nosotros mismos establecimos.
‫Bien, entonces el encabezado de prueba se estableció en jonas que acabamos
‫de enviar en nuestra solicitud.
‫Ahora, para enviar un token web JSON como encabezado, en realidad
‫existe un estándar para hacerlo.
‫Así que volvamos aquí, deshazte de todo esto.
‫Y entonces ese estándar para enviar un token es que
‫siempre debemos usar un encabezado llamado autorización.
‫¿Okey?
‫Así que así y luego
‫el valor de ese encabezado siempre debe comenzar con
‫Bearer, ¿de acuerdo?
‫Porque básicamente llevamos, tenemos, poseemos este token y luego aquí
‫el valor del token.
‫Así que al igual que esta cadena aleatoria que obtuvimos antes.
‫Así que dejémoslo aquí como ejemplo, y
‫enviemos eso ahora.
‫Y entonces, de hecho, deberíamos conseguirlo aquí.
‫Bueno.
‫Now Express convierte automáticamente todos los nombres de encabezado en
‫minúsculas, como puede ver aquí, pero
‫por supuesto, nuestro valor de encabezado aquí sigue siendo el mismo.
‫Está bien, y básicamente esta parte del valor del encabezado
‫es nuestro token.
‫Y así es como deberíamos
‫leer ahora ese token del encabezado.
‫¿Está bien?
‫Entonces, si realmente
‫hay req. encabezados. autorización, está bien,
‫y si
‫comienza básicamente con esta cadena portadora aquí está bien, entonces
‫req. encabezados. autorización y ahora esto
‫es una cadena, por lo
‫que podemos usar startsWith en eso,
‫está bien, así que esto es solo JavaScript normal nuevamente,
‫está bien.
‫Y estas son las condiciones bajo las cuales realmente queremos
‫guardar un token, ¿de acuerdo?
‫Entonces, nuevamente, en caso de que exista
‫el encabezado tghe y su valor comience con Bearer, está bien.
‫Entonces, en ese caso, queremos decir que el token es igual
‫a req. encabezados. autorización y
‫ahora, ¿cómo obtenemos esta segunda parte
‫de la cadena?
‫Bueno, básicamente vamos a dividir la cadena
‫por este carácter de espacio, está bien,
‫que luego creará una matriz
‫con este
‫Portador y con este token y
‫entonces tomaremos esa parte de
‫la matriz que queremos.
‫Entonces, divida usando el espacio, y
‫luego de esa matriz queremos el segundo elemento.
‫¿Está bien?
‫Ahora, en realidad, no podemos definir una variable dentro de un
‫bloque if
‫porque const y let, por
‫lo que la nueva variable declaratoria de ES6 tiene
‫un alcance de bloque, por
‫lo que cualquier cosa que definamos en este bloque aquí
‫no estará disponible fuera de él.
‫Bien, hagámoslo afuera.
‫Y luego simplemente reasigne este valor al token.
‫Bueno.
‫Y ahora, registremos el token en la consola solo
‫para ver si funciona.
‫De acuerdo, y de hecho, consigamos una especie de
‫token real aquí.
‫Entonces, el que acabamos de iniciar sesión.
‫Y luego pon ese aquí, está bien.
‫Así
‫que mándalo y ¡ah!
‫Aquí vamos.
‫Entonces, aquí tenemos nuestros datos de token web JSON que acabamos de enviar
‫junto con la solicitud.
‫Apaguemos rápidamente este registro de consola aquí.
‫De acuerdo, y justo antes de continuar,
‫verifiquemos si el token realmente existe.
‫Bueno.
‫Entonces, si no hay
‫un token bien, entonces, por supuesto, queremos crear un nuevo error.
‫Bien, y al igual que antes,
‫regresamos de este middleware y llamamos
‫al siguiente, está bien.
‫Y ahora aquí, vamos a crear un error y, por lo
‫tanto, pasaremos directamente a
‫nuestro middleware de manejo de errores globales con este error.
‫De acuerdo, si no se envía ningún token con la solicitud, eso
‫significa que no hemos iniciado sesión.
‫Así que enviemos al usuario que no ha iniciado
‫sesión.
‫Inicie sesión para obtener acceso.
‫Muy bien, y ahora el
‫código de estado para este tipo de situación
‫es 401, lo que significa no autorizado, ¿de acuerdo?
‫No estoy seguro de si lo hemos
‫usado antes y sí, en realidad también lo hicimos aquí.
‫Bien, y esto básicamente significa
‫que los datos que se enviaron en la solicitud son
‫correctos, pero básicamente no son suficientes para que el
‫usuario acceda a un recurso que está solicitando.
‫Está bien.
‫Sólo tienes que
‫guardarlo aquí y probarlo de nuevo.
‫Entonces, si básicamente quitamos este encabezado aquí, entonces
‫deberíamos entrar de inmediato en ese error,
‫¿verdad?
‫Y, de hecho, no ha iniciado sesión, inicie
‫sesión para obtener acceso.
‫Con 401 no autorizado.
‫¡Excelente! Entonces esa parte ya está funcionando.
‫Muy bien, y ahora solo para recapitular,
‫ahora mismo no estamos enviando ningún token junto con
‫la solicitud, ¿verdad?
‫Y por esa razón, por supuesto, no hay ninguna ficha, ¿de acuerdo?
‫Y, por lo tanto, creamos
‫este error, que luego activará nuestro middleware de manejo de errores
‫para enviar ese error al cliente, ¿de acuerdo?
‫Y luego, por supuesto, no tenemos acceso a todos
‫los recorridos, porque, por supuesto, este
‫middleware se ejecuta antes que el controlador getAllTours.
‫Y ahora mismo, esto realmente está protegido, ¿de acuerdo?
‫Así que ya está funcionando bastante bien en este momento.
‫Pero, por supuesto, esto está lejos de ser
‫suficiente, porque no es suficiente enviar un token con una solicitud.
‫También debe ser un token válido.
‫Básicamente, un token en el que nadie
‫intentó cambiar la carga útil.
‫De acuerdo, y la carga útil, recuerde, en nuestro
‫caso siempre es el user_id del usuario para el que se emitió el token.
‫De acuerdo, a continuación,
‫debemos implementar este paso de verificación.
‫Pero esta conferencia ya está siendo bastante larga y
‫todavía hay muchas cosas por hacer
‫aquí, así que dejémoslo para el próximo video.