{"id":236,"date":"2023-09-12T17:18:56","date_gmt":"2023-09-12T20:18:56","guid":{"rendered":"https:\/\/danielsegovia.com\/plataforma\/?p=236"},"modified":"2023-09-12T17:21:09","modified_gmt":"2023-09-12T20:21:09","slug":"29-autenticacion-con-jwt","status":"publish","type":"post","link":"https:\/\/danielsegovia.com\/plataforma\/29-autenticacion-con-jwt\/","title":{"rendered":"29 &#8211; Autenticaci\u00f3n con JWT"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En el vertiginoso mundo de la programaci\u00f3n web, la seguridad es una prioridad ineludible. Ya sea que est\u00e9s desarrollando una aplicaci\u00f3n de comercio electr\u00f3nico, una plataforma de redes sociales o cualquier otro tipo de sistema en Node.js, proteger los datos y las interacciones de tus usuarios es crucial. En este emocionante viaje a trav\u00e9s de dos poderosas herramientas de seguridad, Bcrypt y JWT (JSON Web Tokens), te mostraremos c\u00f3mo puedes fortalecer la seguridad de tus aplicaciones web de manera efectiva y elegante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bcrypt y JWT son dos tecnolog\u00edas ampliamente utilizadas en el ecosistema de Node.js, y su combinaci\u00f3n ofrece una s\u00f3lida defensa contra una variedad de amenazas cibern\u00e9ticas. Bcrypt se encarga de proteger las contrase\u00f1as almacenadas en tu base de datos, mientras que JWT te permite gestionar la autenticaci\u00f3n y la autorizaci\u00f3n de manera segura y eficiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, te guiaremos a trav\u00e9s de los conceptos fundamentales de ambas tecnolog\u00edas, explicando c\u00f3mo funcionan y por qu\u00e9 son esenciales para la seguridad de tu aplicaci\u00f3n. Aprender\u00e1s a implementar Bcrypt para almacenar contrase\u00f1as de forma segura, evitando vulnerabilidades comunes como la exposici\u00f3n de contrase\u00f1as en texto plano. Luego, exploraremos c\u00f3mo JWT te permite crear tokens de acceso y garantizar que solo los usuarios autorizados puedan acceder a ciertas partes de tu aplicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autenticaci\u00f3n<\/strong>: En el tejido mismo de cualquier sistema de seguridad, la autenticaci\u00f3n es el proceso que verifica la identidad de un usuario. Es como abrir la puerta principal de una casa solo para aquellos que poseen una llave v\u00e1lida. En el contexto de las aplicaciones web, esto implica la confirmaci\u00f3n de que un usuario es quien dice ser. Com\u00fanmente, esto se logra mediante la combinaci\u00f3n de un nombre de usuario y una contrase\u00f1a, pero tambi\u00e9n puede incluir otros m\u00e9todos como la autenticaci\u00f3n de dos factores (2FA) o la autenticaci\u00f3n biom\u00e9trica. La autenticaci\u00f3n efectiva es el primer paso para garantizar que solo las personas autorizadas tengan acceso a los recursos de una aplicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autorizaci\u00f3n<\/strong>: Una vez que hemos autenticado a un usuario y sabemos qui\u00e9nes son, la autorizaci\u00f3n entra en juego. Esta etapa determina qu\u00e9 acciones o recursos espec\u00edficos tienen permiso para acceder dentro de la aplicaci\u00f3n. Siguiendo con la analog\u00eda de la puerta de la casa, la autorizaci\u00f3n decide qu\u00e9 habitaciones o \u00e1reas est\u00e1n disponibles para el usuario despu\u00e9s de que se haya autenticado correctamente. En el contexto de las aplicaciones web, la autorizaci\u00f3n se basa en roles y permisos que definen qui\u00e9n puede realizar qu\u00e9 acciones. Un ejemplo com\u00fan es el acceso de un usuario normal versus un administrador, donde el administrador tiene acceso a funciones adicionales y datos confidenciales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Encriptaci\u00f3n<\/strong>: Imagina que tus datos son cartas escritas en un idioma desconocido que solo t\u00fa y el destinatario pueden entender. La encriptaci\u00f3n es esa t\u00e9cnica que convierte tus datos en algo incomprensible para cualquiera que intente interceptarlos, a menos que tengan la clave adecuada para descifrarlos. En el mundo de las aplicaciones web, la encriptaci\u00f3n se aplica a menudo para proteger datos en tr\u00e1nsito (por ejemplo, cuando viajan a trav\u00e9s de una conexi\u00f3n segura HTTPS) y datos en reposo (cuando se almacenan en bases de datos o sistemas de archivos). Sin encriptaci\u00f3n, los datos podr\u00edan ser vulnerables a accesos no autorizados o ataques de interceptaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estos tres pilares, autenticaci\u00f3n, autorizaci\u00f3n y encriptaci\u00f3n, forman la base de una s\u00f3lida estrategia de seguridad en aplicaciones web. Ahora que hemos establecido estos conceptos, estaremos mejor preparados para explorar c\u00f3mo Bcrypt y JWT en Node.js contribuyen a la protecci\u00f3n de nuestros sistemas y datos de manera efectiva y confiable. \u00a1Sigamos adelante en este viaje de conocimiento!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">bcrypt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bcrypt es una t\u00e9cnica de encriptaci\u00f3n utilizada espec\u00edficamente para almacenar contrase\u00f1as de manera segura en aplicaciones web y bases de datos. A diferencia de las funciones de hash est\u00e1ndar, como MD5 o SHA-1, Bcrypt est\u00e1 dise\u00f1ado para ser lento y resistente a los ataques de fuerza bruta y diccionario. Uno de los conceptos clave en Bcrypt es el \u00absalt\u00bb (sal), que contribuye en gran medida a su seguridad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Salt (Sal):<\/strong> El salt es una cadena de caracteres aleatoria que se genera de forma \u00fanica para cada contrase\u00f1a antes de aplicar el algoritmo de hash Bcrypt. El prop\u00f3sito del salt es hacer que las contrase\u00f1as en la base de datos sean m\u00e1s resistentes a los ataques de fuerza bruta y ataques de tablas arco\u00edris (rainbow tables).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El salt se concatena con la contrase\u00f1a del usuario antes de aplicar el algoritmo de hash Bcrypt. Debido a que cada usuario tiene un salt \u00fanico, aunque dos usuarios tengan la misma contrase\u00f1a, sus hashes finales ser\u00e1n diferentes debido al salt \u00fanico. Esto significa que un atacante no puede usar tablas arco\u00edris precalculadas (que asumen que las contrase\u00f1as sonlas mismas) para descifrar contrase\u00f1as.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">import bcrypt from 'bcrypt'\n\nlet miPassword = 'Dani123' \/\/pass en texto plano\n\nconst salt = await bcrypt.genSaltSync(10);\nconst passwordHashed = await bcrypt.hash(miPassword, salt)\nconsole.log(passwordHashed)\n\/\/Similar a: $2b$10$aKkpEPaCFyua.Yy4LunmweshtF6zOlQlRbmvXcleWnQDv4dEjpRPa\n\nconst compare1 = await bcrypt.compare('vsdfasdf', passwordHashed);\nconsole.log(compare1) \/\/false\nconst compare2 = await bcrypt.compare('Dani123', passwordHashed);\nconsole.log(compare2) \/\/true<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bcrypt es sumamente com\u00fan para encriptar las contrase\u00f1as de los usuarios antes de insertar la contrase\u00f1a de los usuarios de tu aplicaci\u00f3n en la base de datos, luego, en el proceso de login utilizar el m\u00e9todo compare para saber si la contrase\u00f1a que te env\u00edan coincide con lo que has almacenado en tu base de datos<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">JWT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JSON Web Tokens (JWT) es un est\u00e1ndar abierto (RFC 7519) que se utiliza para transmitir informaci\u00f3n de manera segura entre dos partes, t\u00edpicamente entre un servidor y un cliente, como parte de una autenticaci\u00f3n o una solicitud de autorizaci\u00f3n. Los JWT se componen de tres partes: el header (encabezado), el payload (carga \u00fatil) y la signature (firma).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Header (Encabezado):<\/strong> El header de un JWT contiene informaci\u00f3n sobre c\u00f3mo se debe procesar el token y qu\u00e9 algoritmo se utiliza para firmarlo. Es un objeto JSON que incluye dos partes principales: el tipo de token (generalmente \u00abJWT\u00bb) y el algoritmo de hashing utilizado, como \u00abHS256\u00bb o \u00abRS256\u00bb.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"alg\": \"HS256\",\n  \"typ\": \"JWT\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Payload (Carga \u00datil):<\/strong> El payload lleva la informaci\u00f3n que se quiere transmitir. Puede contener claims (declaraciones) est\u00e1ndar como \u00absub\u00bb (sujeto), \u00abexp\u00bb (tiempo de expiraci\u00f3n), \u00abiss\u00bb (emisor), y claims personalizados definidos por el emisor y el receptor. El payload es la parte del token <strong>que suele ser legible por humanos<\/strong> y puede transportar datos como el ID del usuario, roles y otros atributos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"sub\": \"1234567890\",\n  \"name\": \"John Doe\",\n  \"iat\": 1516239022\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Signature (Firma):<\/strong> La signature es el resultado de tomar el header codificado, el payload codificado, una clave secreta (o clave p\u00fablica\/privada en el caso de JWTs RSA), y aplicar un algoritmo de hashing especificado en el header. Esta firma se utiliza para verificar la integridad del token y asegurarse de que no ha sido modificado por terceros no autorizados. Solo el servidor que posee la clave secreta (o privada) puede generar una firma v\u00e1lida.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">HMACSHA256(\n  base64UrlEncode(header) + \".\" +\n  base64UrlEncode(payload),\n  secret\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora llevemos est\u00e1 explicaci\u00f3n a la parte pr\u00e1ctica de Node.js<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para iniciar instala la dependencia en tu proyecto<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">npm i jsonwebtoken<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Luego utiliza las funciones sign y verify para encriptar y descriptar tu token<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">import jwt from 'jsonwebtoken'\n\nconst objetoQueQuieroEncriptar = {\n    id: \"sdkljh23sdfawl23948\",\n    admin: true,\n    nombre: \"Dani\",\n    apellido: \"Sego\"\n}\n\nconst token = jwt.sign(\n    objetoQueQuieroEncriptar,\n    \"miContrasenaSoloParaBack\")\n\nconsole.log(token)\n\/\/ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InNka2xqaDIzc2RmYXdsMjM5NDgiLCJhZG1pbiI6dHJ1ZSwibm9tYnJlIjoiRGFuaSIsImFwZWxsaWRvIjoiU2VnbyIsImlhdCI6MTY5NDU0NTEzOH0.GwVOArxQP-3Loa8WOrZLt_gKOXlntcfQELXUPEqVCQ8\n\njwt.verify(token, \"miContrasenaSoloParaBack\", (err, data) => {\n    if(err) return err\n    console.log(data)\n\/*\nresultado: \n{\n  id: 'sdkljh23sdfawl23948',\n  admin: true,\n  nombre: 'Dani',\n  apellido: 'Sego',\n  iat: 1694545138\n}*\/\n\n}) <\/code><\/pre>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Flujo de registro &amp; Login<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El flujo b\u00e1sico se refleja en el siguiente gr\u00e1fico<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Primero el usuario se registra enviando usuario y contrase\u00f1a, el servidor se encarga en encriptar la contrase\u00f1a antes de almacenarla en la base de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para realizar la acci\u00f3n de login el usuario env\u00eda su usuario y contrase\u00f1a, el servidor recupera el usuario de la base de datos y compara la contrase\u00f1a env\u00edado en texto plano contra la contrase\u00f1a almacenada en la base de datos encriptada para ver si coindicen.<br>Si el usuario y contrase\u00f1a coinciden responde la solicitud con un token.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por \u00faltimo, el cliente solicita alg\u00fan recurso del servidor y env\u00eda el token a trav\u00e9s del cual el servidor verificar\u00e1 si puede acceder o no al recurso solicitado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image-1024x577.png\" alt=\"\" class=\"wp-image-724\" style=\"width:1106px;height:623px\" width=\"1106\" height=\"623\" srcset=\"https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image-1024x577.png 1024w, https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image-300x169.png 300w, https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image-768x433.png 768w, https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image-1536x866.png 1536w, https:\/\/danielsegovia.com\/plataforma\/wp-content\/uploads\/2023\/09\/image.png 1833w\" sizes=\"auto, (max-width: 1106px) 100vw, 1106px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Revive la clase en vivo<\/h2>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Curso Node.Js - Clase 29 - Auth\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/-KV8dDdcSfw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>En el vertiginoso mundo de la programaci\u00f3n web, la seguridad es una prioridad ineludible. Ya sea que est\u00e9s desarrollando una aplicaci\u00f3n de comercio electr\u00f3nico, una plataforma de redes sociales o cualquier otro tipo de sistema en Node.js, proteger los datos y las interacciones de tus usuarios es crucial. En este emocionante viaje a trav\u00e9s de &#8230; <a title=\"29 &#8211; Autenticaci\u00f3n con JWT\" class=\"read-more\" href=\"https:\/\/danielsegovia.com\/plataforma\/29-autenticacion-con-jwt\/\" aria-label=\"Leer m\u00e1s sobre 29 &#8211; Autenticaci\u00f3n con JWT\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,3],"tags":[50,49,51,48,54,55,47,52,53],"class_list":["post-236","post","type-post","status-publish","format-standard","hentry","category-backend-con-node-js","category-curso-de-node-js","tag-autenticacion","tag-auth","tag-autorizacion","tag-bcrypt","tag-compare","tag-hash","tag-jwt","tag-sign","tag-verify"],"_links":{"self":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/comments?post=236"}],"version-history":[{"count":5,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/236\/revisions"}],"predecessor-version":[{"id":725,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/posts\/236\/revisions\/725"}],"wp:attachment":[{"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/media?parent=236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/categories?post=236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danielsegovia.com\/plataforma\/wp-json\/wp\/v2\/tags?post=236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}