‫Instructor: En la última lección
‫aprendimos que el token web JSON debe
‫almacenarse en una cookie segura solo HTTP.
‫Pero en este momento, solo enviamos
‫el token como una cadena simple en nuestra respuesta JSON.
‫Entonces, en este video, también enviemos el token como una cookie, para
‫que el navegador pueda guardarlo de esta
‫manera más segura.
‫Entonces estamos en nuestro código.
‫¿Realmente enviamos el token al cliente?
‫Bueno, recuerde, eso está en el authController y
‫aquí mismo en la función createSendToken.
‫Así que antes, teníamos básicamente
‫todo este código en muchos lugares diferentes, pero luego
‫lo refactorizamos todo en esta función createSendToken.
‫Está bien, y aquí es donde vamos a trabajar ahora.
‫Ahora, estoy seguro de que está
‫familiarizado con la forma en que funcionan las cookies
‫en general, pero solo para asegurarnos de que todos estamos en la misma
‫página aquí, hablemos un poco sobre las cookies.
‫Entonces, en primer lugar, una cookie es básicamente un
‫pequeño fragmento de texto que un servidor puede enviar a los clientes.
‫Luego, cuando el cliente recibe una cookie,
‫la almacenará automáticamente
‫y luego la enviará automáticamente
‫junto con todas las solicitudes futuras al mismo servidor.
‫De acuerdo, nuevamente, un navegador almacena automáticamente una cookie
‫que recibe y la envía de
‫regreso en todas las solicitudes futuras al servidor de donde proviene.
‫Bien, ahora, por ahora, esto no será
‫realmente importante para nosotros
‫ya que solo estamos probando la API usando Postman.
‫Pero un poco más tarde, cuando vamos a renderizar
‫páginas web dinámicas e interactuar realmente con
‫el navegador, será realmente
‫importante que el navegador envíe el token básicamente
‫de forma automática en cada solicitud.
‫Está bien, y para entonces, por supuesto, hablaremos más sobre eso.
‫Pero de todos modos, ahora aprendamos cómo crear
‫y enviar una cookie.
‫Entonces, para enviar una cookie, en realidad es muy fácil.
‫Todo lo que tenemos que hacer es básicamente adjuntarlo
‫al objeto de respuesta.
‫Entonces decimos res. cookie y luego todo lo
‫que tenemos que hacer es especificar el nombre
‫de la cookie, y lo llamo token
‫web JSON, luego los datos que realmente queremos enviar en
‫la cookie, por lo que, por supuesto, esa será
‫la variable del token y luego, un par de opciones para la cookie.
‫Y la primera opción que
‫vamos a especificar es la propiedad expira.
‫Bien, básicamente, esta propiedad expira hará
‫que el navegador o el cliente en general eliminen
‫la cookie después de que haya expirado.
‫De acuerdo, entonces establecemos una fecha
‫de vencimiento similar a la que configuramos en el token web JSON, de acuerdo.
‫Entonces, creemos una nueva variable para
‫eso, está bien, porque el paquete de token
‫web JSON puede funcionar con este formato.
‫De acuerdo, pero en JavaScript, esto no tiene sentido y,
‫en cambio, creemos una variable con un número real.
‫Así que llamémoslo todavía JWT, luego
‫cookie,
‫caduca y aún lo configuramos en 90, es decir, 90 días,
‫pero nuevamente, sin el D.
‫De acuerdo, ahora podemos realizar operaciones
‫con él porque necesitaremos convertirlo a milisegundos, de acuerdo.
‫Entonces, ¿cuándo debería caducar esta cookie?
‫Debería caducar en una nueva fecha.
‫Entonces, en JavaScript, al especificar fechas,
‫siempre necesitamos decir nueva
‫Fecha y luego debería caducar en este momento, más estos 90 días.
‫Bien, ahora, así, por supuesto.
‫Y luego procesa. env, y
‫ahora, usemos este y luego simplemente coloquemos
‫la cookie allí, de acuerdo.
‫Pero ahora, por supuesto, necesitamos convertir eso a milisegundos.
‫Así que ahora mismo tenemos 90 días.
‫Así que dos horas, son 24 veces.
‫Dos minutos, son 60 veces.
‫Dos segundos, son 60 veces más.
‫Y luego milisegundos, mil veces, está bien.
‫Y, por supuesto, podría hacerlo todo
‫de una vez, pero esto es solo para especificar qué estamos haciendo exactamente.
‫Entonces, para mostrar
‫que en realidad lo estamos convirtiendo a milisegundos.
‫La siguiente opción será la opción segura.
‫Entonces, vamos a establecer este
‫en verdadero y así, la cookie solo se enviará
‫en una conexión encriptada.
‫Básicamente, solo estamos usando HTTPS, de acuerdo.
‫Y finalmente, es esa opción httpOnly de la que
‫hemos hablado antes.
‫Bien, configuramos este como verdadero y
‫esto hará que el
‫navegador no pueda acceder a la cookie ni modificarla de ninguna manera.
‫Bien, y esto es importante para prevenir esos
‫ataques de secuencias de comandos entre sitios.
‫De acuerdo, lo único que
‫hará el navegador cuando establezcamos httpOnly en verdadero
‫es básicamente recibir la
‫cookie, almacenarla y luego enviarla automáticamente junto con cada solicitud.
‫Está bien, y eso es todo.
‫Así es como básicamente definimos la cookie, digamos esta
‫parte, y luego la
‫enviamos usando res. Galleta.
‫Ahora bien, si quisiéramos probar esto ahora mismo, no funcionaría porque
‫en este momento, en realidad, no estamos usando HTTPS.
‫Y así, debido a este seguro: verdadero, la
‫cookie no se
‫crearía y no se enviaría al cliente.
‫Muy bien,
‫y básicamente, solo queremos activar esta parte aquí en producción.
‫Entonces, lo que voy a hacer es
‫básicamente exportar este objeto completo aquí en una variable separada.
‫Bien, déjame mostrarte eso.
‫Entonces,
‫const cookieOptions debería ser igual
‫a esto y luego aquí, pasamos eso.
‫Está bien.
‫Ahora, por supuesto, no queremos esta parte aquí,
‫pero solo cuando estemos en producción.
‫Entonces
‫digamos si proceso. env. NODE_ENV, recuerda que es donde
‫se almacena si estamos en
‫producción o no.
‫Entonces, si eso es
‫igual a la producción, configure cookiesOptions. seguro igual a
‫verdadero.
‫Bien, y ahora, podemos eliminarlo de aquí.
‫Sí, ahora, solo cuando estemos en
‫producción, obtendremos las opciones seguras configuradas como verdaderas.
‫Y de lo contrario, solo se enviará
‫así, solo con la fecha de vencimiento y httpOnly.
‫Bien, ahora probemos esto.
‫Y lo probaré creando un nuevo usuario.
‫Así que aquí en Registrarse en realidad
‫y llamemos a este
‫usuario @ jonas. io.
‫Siempre con la misma contraseña.
‫También lo llamaré
‫Usuario y digamos que el rol aquí es una guía,
‫así que también tenemos algunos roles diferentes aquí.
‫Dale más espacio.
‫Y ahora, intentémoslo en realidad.
‫Y la respuesta es la que esperábamos con la
‫diferencia de que
‫ahora, obtenemos una cookie aquí en esta pestaña de Cookies.
‫Y, de hecho, aquí
‫obtenemos el nombre de la cookie, el valor.
‫También tenemos la fecha de
‫vencimiento, que es exactamente 90 días a partir de ahora.
‫Hemos establecido httpOnly en verdadero y también, seguro establecido en falso.
‫Está bien.
‫Genial, también podemos ver todas las cookies que tenemos aquí
‫en esta pestaña de Cookies.
‫Y nuevamente, vemos esa cookie que recibimos
‫de este dominio, de acuerdo.
‫Ahora, solo una última cosa que realmente quiero
‫cambiar en esa función en la que
‫estamos trabajando, por
‫lo que createSendToken, es básicamente deshacerme de esta contraseña aquí en la salida.
‫Bien, en nuestro esquema, en realidad lo tenemos configurado
‫para seleccionar falso, de modo que no aparezca cuando
‫consultamos por todos los usuarios.
‫Pero en este caso, proviene de la creación de un
‫nuevo documento y eso es diferente y por eso lo vemos aquí.
‫De acuerdo, pero en realidad podemos arreglar esto muy fácilmente.
‫Bien, todo lo que tenemos que hacer en realidad es configurar
‫el usuario. contraseña
‫a indefinida.
‫Muy bien, y eso
‫debería eliminar
‫las contraseñas de la salida.
‫Bueno.
‫Así que eliminemos este usuario aquí que acabamos de crear.
‫E inténtelo de nuevo
‫solo para ver si la contraseña ya no aparece.
‫Y sí, de hecho ahora, se ha ido.
‫Y aún así, nuestra galleta, por supuesto, está aquí.
‫Y cuando ahora venimos aquí a nuestra pestaña Cookies,
‫bueno, entonces todavía tiene una sola cookie
‫porque la anterior ahora fue básicamente sobrescrita por esta
‫nueva y eso
‫es porque tienen el mismo nombre.
‫Entonces, el nombre es como el identificador único de una cookie.
‫Entonces, si recibimos uno con el nombre
‫que ya se
‫le dio, bueno, entonces el anterior simplemente se reemplaza.
‫Está bien, y eso es todo.
‫Así es como enviamos una cookie solo HTTP y,
‫nuevamente, hablaremos más sobre esto
‫cuando creemos nuestro sitio web dinámico.