{"id":72679,"date":"2023-12-27T19:21:09","date_gmt":"2023-12-27T18:21:09","guid":{"rendered":"https:\/\/kinqsta.com\/es\/?p=72679&#038;preview=true&#038;preview_id=72679"},"modified":"2024-01-16T19:08:55","modified_gmt":"2024-01-16T18:08:55","slug":"autenticacion-next-js","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/","title":{"rendered":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js"},"content":{"rendered":"<p>En los \u00faltimos a\u00f1os, a\u00f1adir autenticaci\u00f3n a tu aplicaci\u00f3n ha pasado de ser algo oscuro y complicado a algo para lo que literalmente puedes utilizar una API.<\/p>\n<p>No faltan repositorios de ejemplos y tutoriales sobre c\u00f3mo implementar esquemas de autenticaci\u00f3n espec\u00edficos en Next.js, pero hay menos sobre el porqu\u00e9 de los esquemas, herramientas y los compromisos que esto implica.<\/p>\n<p>Este art\u00edculo tratar\u00e1 sobre lo que hay que tener en cuenta al abordar la autenticaci\u00f3n en Next.js, desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n y la elecci\u00f3n entre el lado del servidor y el lado del cliente.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Elegir un M\u00e9todo \/ Proveedor de Autenticaci\u00f3n<\/h2>\n<p>B\u00e1sicamente, hay 1.000 formas de incorporar la autenticaci\u00f3n a tu aplicaci\u00f3n. En lugar de centrarnos en proveedores concretos (tema para otra entrada del blog), veamos los<strong> tipos de soluciones de autenticaci\u00f3n<\/strong> y algunos ejemplos de cada una. En t\u00e9rminos de implementaci\u00f3n, <a href=\"https:\/\/next-auth.js.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">next-auth<\/a> se est\u00e1 convirtiendo r\u00e1pidamente en una opci\u00f3n popular para integrar tu aplicaci\u00f3n Next.js con m\u00faltiples proveedores, a\u00f1adir SSO, etc.<\/p>\n<h3>Base de Datos Tradicional<\/h3>\n<p>Es de lo m\u00e1s sencillo: almacenas nombres de usuario y contrase\u00f1as en una base de datos relacional. Cuando un usuario se registra por primera vez, insertas una nueva fila en la tabla \u00abusuarios\u00bb con la informaci\u00f3n proporcionada. Cuando se conectan, compruebas las credenciales con lo que tienes almacenado en la tabla. Cuando un usuario quiere cambiar su contrase\u00f1a, actualizas el valor en la tabla.<\/p>\n<p>La autenticaci\u00f3n tradicional de base de datos es, sin duda, el esquema de autenticaci\u00f3n m\u00e1s popular si observas la totalidad de las aplicaciones existentes, y ha existido b\u00e1sicamente desde siempre. Es muy flexible, barato y no te ata a ning\u00fan proveedor en particular. Pero tienes que construirlo t\u00fa mismo y, en particular, tienes que preocuparte de la encriptaci\u00f3n y de asegurarte de que esas valiosas contrase\u00f1as no caigan en manos equivocadas.<\/p>\n<h3>Soluciones de Autenticaci\u00f3n de tu Proveedor de Bases de Datos<\/h3>\n<p>En los \u00faltimos a\u00f1os (y en honor a Firebase, desde hace ya bastantes a\u00f1os), se ha convertido en algo relativamente habitual que los proveedores de bases de datos administradas ofrezcan alg\u00fan tipo de soluci\u00f3n de autenticaci\u00f3n administrada. <a href=\"https:\/\/firebase.google.com\/docs\/auth\">Firebase<\/a>, <a href=\"https:\/\/supabase.com\/auth\">Supabase<\/a> y <a href=\"https:\/\/aws.amazon.com\/cognito\/\">AWS<\/a> ofrecen tanto bases de datos administradas como autenticaci\u00f3n administrada como servicio a trav\u00e9s de un conjunto de API que abstrae f\u00e1cilmente la creaci\u00f3n de usuarios y la gesti\u00f3n de sesiones (m\u00e1s sobre esto m\u00e1s adelante).<\/p>\n<p>Iniciar la sesi\u00f3n de un usuario con la autenticaci\u00f3n Supabase es <a href=\"https:\/\/supabase.com\/docs\/guides\/auth\/auth-email\" target=\"_blank\" rel=\"noopener noreferrer\">tan sencillo como<\/a>:<\/p>\n<pre><code class=\"language-javascript\">async function signInWithEmail() {\n  const { data, error } = await supabase.auth.signInWithPassword({\n    email: 'example@email.com',\n    password: 'example-password',\n  })\n}<\/code><\/pre>\n<h3>Soluciones de Autenticaci\u00f3n que No Provienen de tu Proveedor de Base de Datos<\/h3>\n<p>Posiblemente a\u00fan m\u00e1s com\u00fan que la autenticaci\u00f3n como servicio de tu DBaaS sea la autenticaci\u00f3n como servicio de toda una empresa o producto. <a href=\"https:\/\/auth0.com\/\">Auth0<\/a> existe desde 2013 (ahora es propiedad de Okta), y las \u00faltimas incorporaciones, como <a href=\"https:\/\/stytch.com\/\">Stytch<\/a>, han dado prioridad a la experiencia del desarrollador y se han ganado cierto prestigio.<\/p>\n<figure>\n<p><figure style=\"width: 1244px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/Auth0-authentication.png\" alt=\"La interfaz de usuario que obtienes al utilizar Auth0 para la autenticaci\u00f3n\" width=\"1244\" height=\"814\"><figcaption class=\"wp-caption-text\">Auth0 para la autenticaci\u00f3n<\/figcaption><\/figure><\/figure>\n<h3>Inicio de Sesi\u00f3n \u00danico<\/h3>\n<p>El SSO (siglas en ingl\u00e9s de Inicio de Sesi\u00f3n \u00danico, Single Sign On) te permite \u00abexternalizar\u00bb tu identidad a un proveedor externo, que puede ir desde un proveedor empresarial centrado en la seguridad, como <a href=\"https:\/\/www.okta.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Okta<\/a>, hasta algo m\u00e1s ampliamente adoptado, como <a href=\"https:\/\/developers.google.com\/identity\/gsi\/web\/guides\/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Google<\/a> o GitHub. El SSO de Google es omnipresente en el mundo SaaS, y algunas herramientas centradas en el desarrollador <em>s\u00f3lo<\/em> autentican a trav\u00e9s de GitHub.<\/p>\n<p>Sea cual sea el proveedor que elijas, el SSO suele ser un add-on de los otros tipos de autenticaci\u00f3n anteriores y conlleva <a href=\"https:\/\/workos.com\/blog\/the-developers-guide-to-sso\" target=\"_blank\" rel=\"noopener noreferrer\">su propia idiosincrasia<\/a> en cuanto a la integraci\u00f3n con plataformas externas (atenci\u00f3n: SAML utiliza XML).<\/p>\n<h3>Vale, \u00bfCu\u00e1l es Para M\u00ed?<\/h3>\n<p>Aqu\u00ed no hay una elecci\u00f3n \u00abcorrecta\u00bb \u2014 lo adecuado para tu proyecto depende de tus prioridades. Si quieres poner las cosas en marcha r\u00e1pidamente sin una gran cantidad de configuraci\u00f3n inicial, subcontratar la autenticaci\u00f3n tiene sentido (incluso subcontratarla por completo, incluida la interfaz de usuario, a alguien como Auth0). Si prev\u00e9s una configuraci\u00f3n m\u00e1s compleja, construir tu propio backend de autenticaci\u00f3n tiene sentido. Y si prev\u00e9s dar soporte a clientes m\u00e1s grandes, necesitar\u00e1s a\u00f1adir SSO en alg\u00fan momento.<\/p>\n<p>Next.js es tan popular en este momento que la mayor\u00eda de estos proveedores de autenticaci\u00f3n tienen documentaci\u00f3n y gu\u00edas de integraci\u00f3n espec\u00edficas para Next.js.<\/p>\n<h2><strong>Creaci\u00f3n de Rutas para el Registro y el Inicio de Sesi\u00f3n, y Consejos para Ir un Paso M\u00e1s All\u00e1 en la Autenticaci\u00f3n<\/strong><\/h2>\n<p>Algunos proveedores de autenticaci\u00f3n, como Auth0, proporcionan p\u00e1ginas web alojadas completas para el registro y el inicio de sesi\u00f3n. Pero si las creas desde cero, creo que es \u00fatil crearlas al principio del proceso, ya que las necesitar\u00e1s como redirecciones cuando implementes tu autenticaci\u00f3n.<\/p>\n<p>As\u00ed que tiene sentido crear la estructura de estas p\u00e1ginas y luego a\u00f1adir las peticiones al backend. La forma m\u00e1s sencilla de implementar la autenticaci\u00f3n es tener estas dos rutas:<\/p>\n<ul>\n<li>Una para <strong>registrarse<\/strong><\/li>\n<li>Otra para <strong>iniciar sesi\u00f3n<\/strong> una vez que el usuario ya tiene una cuenta<\/li>\n<\/ul>\n<p>M\u00e1s all\u00e1 de lo b\u00e1sico, tendr\u00e1s que cubrir casos extremos, como cuando un usuario olvida su contrase\u00f1a. Algunos equipos prefieren tener el proceso de restablecimiento de contrase\u00f1a en una ruta separada, mientras que otros a\u00f1aden elementos din\u00e1micos de interfaz de usuario a la p\u00e1gina de inicio de sesi\u00f3n normal.<\/p>\n<p>Puede que una p\u00e1gina de registro atractiva no suponga la diferencia entre el \u00e9xito y el fracaso, pero los peque\u00f1os detalles pueden dejar una buena impresi\u00f3n y, en general, proporcionar una mejor Experiencia de Usuario. Aqu\u00ed tienes una recopilaci\u00f3n de sitios web que han puesto un poco m\u00e1s de cari\u00f1o en sus procesos de autenticaci\u00f3n.<\/p>\n<h3>1. Actualiza tu Barra de Navegaci\u00f3n Si Hay una Sesi\u00f3n Activa<\/h3>\n<p>La llamada a la acci\u00f3n de Stripe en su barra de navegaci\u00f3n cambia en funci\u00f3n de si tienes una sesi\u00f3n autenticada o no. Este es el aspecto del sitio de marketing si no est\u00e1s autenticado. Observa la llamada a la acci\u00f3n para iniciar sesi\u00f3n:<\/p>\n<figure>\n<p><figure style=\"width: 1999px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/stripe-homepage.png\" alt=\"P\u00e1gina de Inicio de Stripe\" width=\"1999\" height=\"1191\"><figcaption class=\"wp-caption-text\">La p\u00e1gina de inicio de Stripe cambia la CTA en funci\u00f3n de si est\u00e1s autenticado<\/figcaption><\/figure><\/figure>\n<p>Y este es el aspecto si est\u00e1s autenticado. Observa que la llamada a la acci\u00f3n cambia para llevar al usuario a su panel de control en lugar de iniciar sesi\u00f3n:<\/p>\n<figure>\n<p><figure style=\"width: 1999px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/stripe-homepage-changes.png\" alt=\"Cambios en la p\u00e1gina de inicio de Stripe\" width=\"1999\" height=\"1176\"><figcaption class=\"wp-caption-text\">Cambios en la p\u00e1gina de inicio de Stripe<\/figcaption><\/figure><\/figure>\n<p>No cambia fundamentalmente mi experiencia con Stripe, pero es agradable.<\/p>\n<p>Un apunte t\u00e9cnico interesante: hay una buena raz\u00f3n por la que la mayor\u00eda de las empresas no hacen que la barra de navegaci\u00f3n de su sitio de marketing \u00abdependa\u00bb de la autenticaci\u00f3n \u2014 supondr\u00eda una solicitud adicional a la API para comprobar el estado de autenticaci\u00f3n en cada carga de p\u00e1gina, que en la mayor\u00eda de los casos corresponde a visitantes que probablemente no lo est\u00e1n.<\/p>\n<h3>2. A\u00f1ade Contenido \u00datil Junto al Formulario de Registro<\/h3>\n<p>En los \u00faltimos a\u00f1os, especialmente en SaaS, las empresas han empezado a a\u00f1adir contenido a la p\u00e1gina de registro para \u00abanimar\u00bb al usuario a completar el registro. Esto puede ayudar a mejorar tu conversi\u00f3n en la p\u00e1gina, al menos incrementalmente.<\/p>\n<p>Aqu\u00ed tienes una p\u00e1gina de registro de Retool, con una animaci\u00f3n y algunos logotipos en el lateral:<\/p>\n<figure style=\"width: 1999px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/retool-signup-page.png\" alt=\"P\u00e1gina de registro de Retool\" width=\"1999\" height=\"1083\"><figcaption class=\"wp-caption-text\">Si vas a hacer esto, procura que las fuentes de cada lado coincidan.<\/figcaption><\/figure>\n<p>Tambi\u00e9n lo hacemos en Kinsta para nuestra p\u00e1gina de registro:<\/p>\n<figure>\n<p><figure style=\"width: 1999px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/mykinsta-sign-in.png\" alt=\"P\u00e1gina de registro de Kinsta\" width=\"1999\" height=\"1174\"><figcaption class=\"wp-caption-text\">P\u00e1gina de registro de Kinsta<\/figcaption><\/figure><\/figure>\n<p>El peque\u00f1o contenido extra puede ayudar a recordar al usuario para qu\u00e9 se est\u00e1 registrando y por qu\u00e9 lo necesita.<\/p>\n<h3>3. Si Utilizas una Contrase\u00f1a: Sugiere o Exige una Contrase\u00f1a Fuerte<\/h3>\n<p>Me siento c\u00f3modo diciendo que es de conocimiento com\u00fan entre los desarrolladores que las contrase\u00f1as son intr\u00ednsecamente inseguras, pero <em>no<\/em> es de conocimiento com\u00fan entre todas las personas que se registrar\u00e1n en tu producto. Animar a tus usuarios a crear contrase\u00f1as seguras es bueno para ti y para ellos.<\/p>\n<p>Coinbase es bastante estricta con el registro y exige que utilices una contrase\u00f1a segura que sea m\u00e1s complicada que tu nombre de pila:<\/p>\n<figure>\n<p><figure style=\"width: 1428px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/coinbase-create-account.png\" alt=\"Crear cuenta Coinbase\" width=\"1428\" height=\"1494\"><figcaption class=\"wp-caption-text\">Contrase\u00f1a d\u00e9bil en Coinbase<\/figcaption><\/figure><\/figure>\n<p>Despu\u00e9s de generar una con mi gestor de contrase\u00f1as, pude empezar:<\/p>\n<figure>\n<p><figure style=\"width: 1464px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/coinbase-password-strength.png\" alt=\"Contrase\u00f1a segura en Coinbase\" width=\"1464\" height=\"1462\"><figcaption class=\"wp-caption-text\">Contrase\u00f1a segura en Coinbase<\/figcaption><\/figure><\/figure>\n<p>La Interfaz de Usuario no me dec\u00eda por qu\u00e9 la contrase\u00f1a no era lo suficientemente segura, ni ning\u00fan requisito m\u00e1s all\u00e1 de tener un n\u00famero. Si los incluyes en el texto del producto, facilitar\u00e1s las cosas al usuario y evitar\u00e1s la frustraci\u00f3n de tener que volver a intentar introducir la contrase\u00f1a.<\/p>\n<h3>4. Etiqueta Tus Entradas para que Funcionen Bien con un Gestor de Contrase\u00f1as<\/h3>\n<p>Uno de cada tres estadounidenses utiliza un gestor de contrase\u00f1as como <a href=\"https:\/\/1password.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">1Password<\/a> y, sin embargo, muchos formularios web siguen ignorando el \u00abtype=\u00bb en las entradas HTML. <a href=\"https:\/\/hidde.blog\/making-password-managers-play-ball-with-your-login-form\/\">Haz que tus formularios sean compatibles con los gestores de contrase\u00f1as<\/a>:<\/p>\n<ul>\n<li>Incluye tus elementos de entrada en un elemento de formulario<\/li>\n<li>Asigna un tipo y una etiqueta a las entradas<\/li>\n<li>A\u00f1ade funciones de autocompletar a tus entradas<\/li>\n<li>No a\u00f1adas campos din\u00e1micamente (te estoy mirando a ti, <a href=\"https:\/\/www.reddit.com\/r\/delta\/comments\/f8s1sq\/why_does_the_delta_website_require_my_last_name\/\" target=\"_blank\" rel=\"noopener noreferrer\">Delta<\/a>)<\/li>\n<\/ul>\n<p>Puede marcar la diferencia entre un inicio de sesi\u00f3n de 10 segundos incre\u00edblemente fluido y uno manual molesto, especialmente en m\u00f3viles.<\/p>\n<h2><strong>Elegir Entre Sesiones y JWT<\/strong><\/h2>\n<p>Una vez que tu usuario se autentique, tienes que elegir una estrategia para mantener ese estado a lo largo de las siguientes solicitudes. HTTP no tiene estado, y desde luego no queremos pedir a nuestro usuario su contrase\u00f1a en cada solicitud. Hay <a href=\"https:\/\/stytch.com\/blog\/jwts-vs-sessions-which-is-right-for-you\/\" target=\"_blank\" rel=\"noopener noreferrer\">dos m\u00e9todos populares para manejar esto<\/a> \u2014 <strong>sesiones<\/strong> (o cookies) y <strong>JWTs<\/strong> (tokens web JSON) \u2014 y difieren en t\u00e9rminos de si el servidor o el cliente hace el trabajo.<\/p>\n<h3>Sesiones, Tambi\u00e9n Conocidas como Cookies<\/h3>\n<p>En la autenticaci\u00f3n basada en sesiones, la l\u00f3gica y el trabajo para mantener la autenticaci\u00f3n son gestionados por <strong>el servidor<\/strong>. \u00c9ste es el flujo b\u00e1sico:<\/p>\n<ol start=\"1\">\n<li>El usuario se autentica a trav\u00e9s de la p\u00e1gina de inicio de sesi\u00f3n.<\/li>\n<li><strong>El servidor crea un registro<\/strong> que representa esta \u00absesi\u00f3n\u00bb de navegaci\u00f3n concreta. Normalmente se inserta en una base de datos con un identificador aleatorio y detalles sobre la sesi\u00f3n, como cu\u00e1ndo comenz\u00f3 y cu\u00e1ndo expira.<\/li>\n<li>Ese identificador aleatorio \u2014 algo as\u00ed como \u00ab6982e583b1874abf9078e1d1dd5442f1\u00bb \u2014 se env\u00eda a tu navegador y <strong>se almacena como cookie<\/strong>.<\/li>\n<li>En posteriores peticiones del cliente, se incluye el identificador y se <strong>comprueba en la tabla de sesiones<\/strong> de la base de datos.<\/li>\n<\/ol>\n<p>Es bastante sencillo y ajustable en cuanto a la duraci\u00f3n de las sesiones, cu\u00e1ndo deben revocarse, etc. La desventaja es la latencia a una escala significativa, dadas todas las escrituras y lecturas en la base de datos, pero eso puede no ser una consideraci\u00f3n importante para la mayor\u00eda de los lectores.<\/p>\n<h3>Tokens Web JSON (JWT)<\/h3>\n<p>En lugar de gestionar la autenticaci\u00f3n de las solicitudes posteriores en el servidor, <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc7519\" target=\"_blank\" rel=\"noopener noreferrer\">JWTs<\/a> te permiten gestionarlas (en su mayor parte) en el <strong>lado del cliente<\/strong>. Funciona as\u00ed<\/p>\n<ol start=\"1\">\n<li>El usuario se autentica a trav\u00e9s de la p\u00e1gina de inicio de sesi\u00f3n.<\/li>\n<li><strong>El servidor genera un JWT<\/strong> que contiene la identidad del usuario, los permisos que tiene concedidos y una fecha de caducidad (entre otras posibles cosas).<\/li>\n<li><strong>El servidor firma ese token<\/strong>, cifra criptogr\u00e1ficamente su contenido y lo env\u00eda entero al cliente.<\/li>\n<li>Para cada solicitud, el cliente puede <strong>descifrar el token<\/strong> y verificar que el usuario tiene permiso para hacer la solicitud (todo ello sin necesidad de comunicarse con el servidor).<\/li>\n<\/ol>\n<p>Con todo el trabajo posterior a la autenticaci\u00f3n inicial descargado en el cliente, tu aplicaci\u00f3n puede cargarse y funcionar mucho m\u00e1s r\u00e1pido. Pero hay un problema principal: no hay forma de invalidar un JWT desde el servidor. Si el usuario quiere desconectarse de un dispositivo o cambia el alcance de su autorizaci\u00f3n, tienes que esperar a que caduque el JWT.<\/p>\n<h2><strong>Elegir entre la Autenticaci\u00f3n en el Lado del Servidor y en el Lado del Cliente<\/strong><\/h2>\n<p>Parte de lo que hace grande a Next.js es el renderizado est\u00e1tico incorporado \u2014 si tu p\u00e1gina es est\u00e1tica, es decir, no necesita hacer ninguna llamada a una API externa, Next.js la almacena autom\u00e1ticamente en cach\u00e9 y puede servirla extremadamente r\u00e1pido a trav\u00e9s de una CDN. La versi\u00f3n anterior a Next.js 13 sabe si una p\u00e1gina es est\u00e1tica si no incluye ning\u00fan `getServerSideProps` o `getInitialProps` en el archivo, mientras que las versiones posteriores a Next.js 13 utilizan <a href=\"https:\/\/nextjs.org\/docs\/app\/building-your-application\/rendering\/server-components\" target=\"_blank\" rel=\"noopener noreferrer\">Componentes de Servidor React<\/a> para hacerlo.<\/p>\n<p>Para la autenticaci\u00f3n, <a href=\"https:\/\/nextjs.org\/docs\/pages\/building-your-application\/routing\/authenticating\">puedes elegir entre<\/a>: renderizar una p\u00e1gina est\u00e1tica de \u00abcarga\u00bb y hacer la obtenci\u00f3n en el lado del cliente o hacerlo todo en el lado del servidor. Para las p\u00e1ginas que requieren autenticaci\u00f3n<a href=\"#ftnt1\">[1]<\/a>, puedes renderizar un \u00abesqueleto\u00bb est\u00e1tico y luego hacer las peticiones de autenticaci\u00f3n en el lado del cliente. En teor\u00eda, esto significa que la p\u00e1gina se carga m\u00e1s r\u00e1pido, aunque el contenido inicial no est\u00e9 totalmente listo.<\/p>\n<p>Aqu\u00ed tienes un ejemplo simplificado de la documentaci\u00f3n que muestra un estado de carga mientras el objeto usuario no est\u00e9 listo:<\/p>\n<pre><code class=\"language-javascript\">import useUser from '..\/lib\/useUser'\n \nconst Profile = () =&gt; {\n  \/\/ Fetch the user client-side\n  const { user } = useUser({ redirectTo: '\/login' })\n \n  \/\/ Server-render loading state\n  if (!user || user.isLoggedIn === false) {\n    \/\/ Build some sort of loading page here\n    return &lt;div&gt;Loading...&lt;\/div&gt;\n  }\n \n  \/\/ Once the user request finishes, show the user\n  return (\n    &lt;div&gt;\n      &lt;h1&gt;Your Account&lt;\/h1&gt;\n      &lt;p&gt;Username: {JSON.stringify(user.username,null)}&lt;\/p&gt;\n      &lt;p&gt;Email: {JSON.stringify(user.email,null)}&lt;\/p&gt;\n      &lt;p&gt;Address: {JSON.stringify(user.address,null)}&lt;\/p&gt;\n    &lt;\/div&gt;\n  )\n}\n \nexport default Profile<\/code><\/pre>\n<p>Ten en cuenta que aqu\u00ed necesitar\u00edas construir alg\u00fan tipo de interfaz de usuario de carga para mantener el espacio mientras el cliente realiza peticiones tras la carga.<\/p>\n<p>Si quieres simplificar las cosas y ejecutar la autenticaci\u00f3n en el lado del servidor, puedes a\u00f1adir tu solicitud de autenticaci\u00f3n en la funci\u00f3n `getServerSideProps`, y Next esperar\u00e1 a renderizar la p\u00e1gina hasta que se complete la solicitud. En lugar de la l\u00f3gica condicional del fragmento anterior, ejecutar\u00edas algo m\u00e1s sencillo como esta versi\u00f3n simplificada de los documentos de Next:<\/p>\n<pre><code class=\"language-javascript\">import withSession from '..\/lib\/session'\n \nexport const getServerSideProps = withSession(async function ({ req, res }) {\n  const { user } = req.session\n \n  if (!user) {\n    return {\n      redirect: {\n        destination: '\/login',\n        permanent: false,\n      },\n    }\n  }\n \n  return {\n    props: { user },\n  }\n})\n \nconst Profile = ({ user }) =&gt; {\n  \/\/ Show the user. No loading state is required\n  return (\n    &lt;div&gt;\n      &lt;h1&gt;Your Account&lt;\/h1&gt;\n      &lt;p&gt;Username: {JSON.stringify(user.username,null)}&lt;\/p&gt;\n      &lt;p&gt;Email: {JSON.stringify(user.email,null)}&lt;\/p&gt;\n      &lt;p&gt;Address: {JSON.stringify(user.address,null)}&lt;\/p&gt;\n    &lt;\/div&gt;\n  )\n}\n \nexport default Profile<\/code><\/pre>\n<p>Aqu\u00ed sigue habiendo l\u00f3gica para gestionar cuando falla la autenticaci\u00f3n, pero redirige al inicio de sesi\u00f3n en lugar de mostrar un estado de carga.<\/p>\n<h2>Resumen<\/h2>\n<p>Entonces, \u00bfcu\u00e1l de estas opciones es la adecuada para tu proyecto? Empieza por evaluar hasta qu\u00e9 punto conf\u00edas en la velocidad de tu esquema de autenticaci\u00f3n. Si tus peticiones no tardan nada, puedes ejecutarlas en el lado del servidor y evitar el estado de carga. Si quieres dar prioridad a renderizar <em>algo<\/em> de inmediato y luego esperar a la solicitud, omite `getServerSideProps` y ejecuta la autenticaci\u00f3n en otro lugar.<\/p>\n<p><a href=\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#ftnt_ref1\">[1]<\/a>\u00a0Cuando utilices Next, \u00e9sta es una buena raz\u00f3n para no exigir la autenticaci\u00f3n en todas y cada una de las p\u00e1ginas. Es m\u00e1s sencillo hacerlo, pero significa que, en primer lugar, pierdes las ventajas de rendimiento del framework web.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En los \u00faltimos a\u00f1os, a\u00f1adir autenticaci\u00f3n a tu aplicaci\u00f3n ha pasado de ser algo oscuro y complicado a algo para lo que literalmente puedes utilizar una &#8230;<\/p>\n","protected":false},"author":310,"featured_media":72680,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1296,1321],"class_list":["post-72679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-frameworks-javascript","topic-react"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Consideraciones al Configurar la Autenticaci\u00f3n en Next.js - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js\" \/>\n<meta property=\"og:description\" content=\"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-27T18:21:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-16T18:08:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Justin Gage\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Justin Gage\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\"},\"author\":{\"name\":\"Justin Gage\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\"},\"headline\":\"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js\",\"datePublished\":\"2023-12-27T18:21:09+00:00\",\"dateModified\":\"2024-01-16T18:08:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\"},\"wordCount\":2620,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\",\"url\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\",\"name\":\"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\",\"datePublished\":\"2023-12-27T18:21:09+00:00\",\"dateModified\":\"2024-01-16T18:08:55+00:00\",\"description\":\"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Frameworks JavaScript\",\"item\":\"https:\/\/kinqsta.com\/es\/secciones\/frameworks-javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/es\/#website\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\",\"name\":\"Justin Gage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"caption\":\"Justin Gage\"},\"description\":\"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.\",\"sameAs\":[\"https:\/\/technically.substack.com\/\"],\"url\":\"https:\/\/kinqsta.com\/es\/blog\/author\/justingage\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js - Kinsta\u00ae","description":"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/","og_locale":"es_ES","og_type":"article","og_title":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js","og_description":"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?","og_url":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-12-27T18:21:09+00:00","article_modified_time":"2024-01-16T18:08:55+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","type":"image\/jpeg"}],"author":"Justin Gage","twitter_card":"summary_large_image","twitter_description":"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?","twitter_image":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Justin Gage","Tiempo de lectura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/"},"author":{"name":"Justin Gage","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f"},"headline":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js","datePublished":"2023-12-27T18:21:09+00:00","dateModified":"2024-01-16T18:08:55+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/"},"wordCount":2620,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/","url":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/","name":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","datePublished":"2023-12-27T18:21:09+00:00","dateModified":"2024-01-16T18:08:55+00:00","description":"Desde la elecci\u00f3n de un proveedor hasta la creaci\u00f3n de rutas para el inicio de sesi\u00f3n, hay que tener en cuenta varios aspectos a la hora de configurar la autenticaci\u00f3n en Next.js?","breadcrumb":{"@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#primaryimage","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/considerations-when-setting-up-authentication-in-next-js.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/es\/blog\/autenticacion-next-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Frameworks JavaScript","item":"https:\/\/kinqsta.com\/es\/secciones\/frameworks-javascript\/"},{"@type":"ListItem","position":3,"name":"Consideraciones al Configurar la Autenticaci\u00f3n en Next.js"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/es\/#website","url":"https:\/\/kinqsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinqsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f","name":"Justin Gage","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinqsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","caption":"Justin Gage"},"description":"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.","sameAs":["https:\/\/technically.substack.com\/"],"url":"https:\/\/kinqsta.com\/es\/blog\/author\/justingage\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/users\/310"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/comments?post=72679"}],"version-history":[{"count":7,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72679\/revisions"}],"predecessor-version":[{"id":72977,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/posts\/72679\/revisions\/72977"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/translations\/es"},{"href":"https:\/\/kinqsta.com\/es\/wp-json\/kinsta\/v1\/posts\/72679\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media\/72680"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/media?parent=72679"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/tags?post=72679"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/es\/wp-json\/wp\/v2\/topic?post=72679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}