{"id":659,"date":"2024-10-30T13:18:37","date_gmt":"2024-10-30T13:18:37","guid":{"rendered":"https:\/\/alexpadulles.es\/blog\/?p=659"},"modified":"2024-10-30T13:18:37","modified_gmt":"2024-10-30T13:18:37","slug":"laravel-sanctum-csrf-cookie-http-error-419","status":"publish","type":"post","link":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/","title":{"rendered":"Laravel Sanctum CSRF-Cookie; http error: 419"},"content":{"rendered":"<h1>Gu\u00eda Completa para Configurar Sanctum CSRF-Cookie y Autenticaci\u00f3n en Axios (v1.7)<\/h1>\n<p>Axios es una popular biblioteca de JavaScript que simplifica el env\u00edo de solicitudes HTTP en aplicaciones web. Con la llegada de las versiones 1.6 y 1.7.1, Axios introdujo un cambio importante en la gesti\u00f3n de <strong>Sanctum CSRF-Cookie<\/strong> en respuesta a una vulnerabilidad de seguridad, implementando una verificaci\u00f3n de origen que refuerza la seguridad en entornos de desarrollo y producci\u00f3n. Esto significa que en la versi\u00f3n 1.5, no hay problemas para enviar el token CSRF simplemente haciendo la petici\u00f3n a <strong><code>\/sanctum\/csrf-cookie<\/code><\/strong> y configurando <code><strong>withCredentials:<\/strong> true<\/code> en Axios. Sin embargo, en las versiones m\u00e1s recientes, esta configuraci\u00f3n ya no es suficiente, por lo que a continuaci\u00f3n te mostramos una soluci\u00f3n para manejar este cambio.<\/p>\n<p>Esta gu\u00eda ofrece una soluci\u00f3n si estas montando tu propia <a href=\"https:\/\/alexpadulles.es\/blog\/creando-una-api-con-laravel-11\/\" target=\"_blank\" rel=\"noopener\">API en laravel 11<\/a> a las limitaciones introducidas a partir de Axios 1.5.1, especialmente en configuraciones de arquitectura <strong>cross-domain<\/strong> (es decir, en aplicaciones SPA alojadas en un dominio que se comunican con una API en otro dominio). Exploraremos c\u00f3mo configurar Axios para incluir tokens CSRF y de autorizaci\u00f3n en las solicitudes, garantizando una comunicaci\u00f3n segura entre el frontend y el backend. Adem\u00e1s, presentaremos alternativas como trabajar en un mismo dominio o subdominio para quienes prefieran evitar configuraciones adicionales.<\/p>\n<p>\u00bfNecesitas un\u00a0<strong>programador?<\/strong>\u00a0<a href=\"https:\/\/alexpadulles.es\/#contact\" target=\"_blank\" rel=\"noopener\">Contacta conmigo<\/a><\/p>\n<h2>1. \u00bfPor qu\u00e9 Cambiaron las Configuraciones de CSRF en Axios 1.5.1?<\/h2>\n<p>A partir de la versi\u00f3n 1.5.1, Axios implement\u00f3 cambios en la gesti\u00f3n del token CSRF para mejorar la seguridad de las aplicaciones que utilizan esta biblioteca. Este cambio surgi\u00f3 a ra\u00edz de una vulnerabilidad cr\u00edtica que expon\u00eda a las aplicaciones a posibles ataques <a href=\"https:\/\/msmk.university\/que-es-un-csrf-msmk-university\/\" target=\"_blank\" rel=\"noopener\">CSRF<\/a>. Axios ahora env\u00eda el token CSRF solo si la solicitud proviene del mismo dominio que gener\u00f3 el token en primer lugar. Esto agrega una capa de seguridad pero tambi\u00e9n limita las aplicaciones que operan en entornos cross-domain, como:<\/p>\n<ul>\n<li>Aplicaciones SPA en <code>app.midominio.com<\/code> que interact\u00faan con APIs en <code>api.midominio.com<\/code><\/li>\n<li>Configuraciones donde el frontend y backend se alojan en diferentes dominios o subdominios<\/li>\n<\/ul>\n<p>En estos casos, configurar <code>axios.defaults.withCredentials = true;<\/code> no es suficiente para asegurar una gesti\u00f3n adecuada del token CSRF, ya que la pol\u00edtica de origen cruzado puede bloquear el env\u00edo del token en entornos separados. A continuaci\u00f3n, explicamos c\u00f3mo configurar Axios para manejar correctamente los tokens CSRF y de autorizaci\u00f3n en estas arquitecturas.<\/p>\n<h2>2. Configuraci\u00f3n Inicial de Axios para Sanctum CSRF-Cookie y Autenticaci\u00f3n<\/h2>\n<p>Primero, debemos configurar algunos valores predeterminados en Axios, de forma que incluya cookies en las solicitudes y establezca nombres personalizados para el token CSRF:<\/p>\n<pre><code>\r\nimport axios from 'axios';\r\n\r\naxios.defaults.withCredentials = true;\r\naxios.defaults.xsrfCookieName = 'XSRF-TOKEN';\r\naxios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';\r\n<\/code><\/pre>\n<p>Esta configuraci\u00f3n inicial asegura que Axios incluya cookies en todas las solicitudes y utilice los nombres correctos para el encabezado y la cookie donde se almacena el token CSRF. Sin embargo, como mencionamos antes, esto no ser\u00e1 suficiente en una arquitectura cross-domain sin la implementaci\u00f3n de configuraciones adicionales.<\/p>\n<h2>3. Crear Instancias de Axios para Solicitudes P\u00fablicas y Autenticadas<\/h2>\n<p>Para gestionar mejor las solicitudes, crearemos dos instancias de Axios: una para solicitudes p\u00fablicas (<code>api_users_reg<\/code>) y otra para solicitudes autenticadas (<code>api_users_token<\/code>). Esto nos permite diferenciar el tipo de solicitudes y gestionar correctamente los encabezados seg\u00fan el caso.<\/p>\n<pre><code>\r\nconst api_users_reg = axios.create({\r\n    baseURL: process.env.VUE_APP_API_URL,\r\n});\r\n\r\nconst api_users_token = axios.create({\r\n    baseURL: process.env.VUE_APP_API_URL,\r\n});\r\n<\/code><\/pre>\n<p>Esta separaci\u00f3n permite una configuraci\u00f3n espec\u00edfica para cada tipo de solicitud, fundamental para garantizar que el token CSRF y el token de autorizaci\u00f3n se env\u00eden en solicitudes cuando corresponda.<\/p>\n<h2>4. Obtener el Sanctum CSRF-Cookie desde las Cookies<\/h2>\n<p>Es esencial crear una funci\u00f3n que obtenga el token CSRF almacenado en la cookie <code>XSRF-TOKEN<\/code>. As\u00ed podremos incluirlo manualmente en las solicitudes para cumplir con las pol\u00edticas de Axios 1.5.1 y superiores.<\/p>\n<pre><code>\r\nfunction getCsrfTokenFromCookies() {\r\n    return document.cookie.split(';')\r\n        .map(cookie =&gt; cookie.split('=', 2))\r\n        .find(cookieKV =&gt; cookieKV[0].trim() === 'XSRF-TOKEN')?.[1];\r\n}\r\n<\/code><\/pre>\n<p>Esta funci\u00f3n localiza y devuelve el valor de <code>XSRF-TOKEN<\/code> de <code>document.cookie<\/code>, necesario para las solicitudes sensibles en un entorno de dominio cruzado.<\/p>\n<h2>5. Configurar el Interceptor de Solicitudes para CSRF y Autorizaci\u00f3n<\/h2>\n<p>A\u00f1adimos un interceptor que verifica el m\u00e9todo HTTP de la solicitud. Para m\u00e9todos como <code>POST<\/code>, <code>PUT<\/code>, <code>PATCH<\/code> y <code>DELETE<\/code>, el token CSRF se a\u00f1adir\u00e1 desde la cookie al encabezado <code>X-XSRF-TOKEN<\/code>. En el caso de solicitudes autenticadas, el interceptor tambi\u00e9n incluye el token de autorizaci\u00f3n.<\/p>\n<pre><code>\r\nconst csrfInterceptor = (config) =&gt; {\r\n    if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(config.method?.toUpperCase())) {\r\n        const csrfToken = getCsrfTokenFromCookies();\r\n        if (csrfToken) {\r\n            config.headers['X-XSRF-TOKEN'] = decodeURIComponent(csrfToken);\r\n        }\r\n    }\r\n\r\n    if (config.baseURL === api_users_token.defaults.baseURL) {\r\n        const userData = localStorage.getItem(\"user\");\r\n        const parsedData = JSON.parse(userData);\r\n        const token = parsedData?.token;\r\n        if (token) {\r\n            config.headers['Authorization'] = `Bearer ${token}`;\r\n        }\r\n    }\r\n    return config;\r\n};\r\n<\/code><\/pre>\n<h2>6. Aplicar el Interceptor a las Instancias de Axios<\/h2>\n<p>Para aplicar el interceptor a las solicitudes, lo a\u00f1adimos a ambas instancias de Axios (<code>api_users_reg<\/code> y <code>api_users_token<\/code>). Esto permite que cada solicitud maneje de manera correcta los encabezados de CSRF y autorizaci\u00f3n cuando corresponda.<\/p>\n<pre><code>\r\napi_users_reg.interceptors.request.use(csrfInterceptor, error =&gt; Promise.reject(error));\r\napi_users_token.interceptors.request.use(csrfInterceptor, error =&gt; Promise.reject(error));\r\n<\/code><\/pre>\n<h2>7. Configuraci\u00f3n del Idioma en las Solicitudes P\u00fablicas<\/h2>\n<p>Para las solicitudes p\u00fablicas (<code>api_users_reg<\/code>), a\u00f1adimos otro interceptor que toma el idioma preferido del usuario almacenado en <code>localStorage<\/code> y lo env\u00eda en el encabezado <code>Accept-Language<\/code> para una mejor personalizaci\u00f3n del contenido.<\/p>\n<pre><code>\r\napi_users_reg.interceptors.request.use(config =&gt; {\r\n    const lang = localStorage.getItem('preferredLanguage') || 'en';\r\n    config.headers['Accept-Language'] = lang;\r\n    return config;\r\n}, error =&gt; Promise.reject(error));\r\n<\/code><\/pre>\n<h2>8. Exportar las Instancias de Axios<\/h2>\n<p>Finalmente, exportamos <code>api_users_reg<\/code> y <code>api_users_token<\/code> en un solo objeto, lo que facilita el uso de ambas configuraciones en toda la aplicaci\u00f3n.<\/p>\n<pre><code>\r\nexport const apiClient = {\r\n    auth: api_users_token,\r\n    public: api_users_reg\r\n};\r\n<\/code><\/pre>\n<h2>Alternativas: Evitar el Cross-Domain<\/h2>\n<p>Si bien la configuraci\u00f3n detallada es funcional, otra soluci\u00f3n viable para evitar problemas de CSRF en configuraciones de Axios 1.5.1+ es alojar el frontend y el backend en el mismo dominio o en subdominios, por ejemplo:<\/p>\n<ul>\n<li>Frontend en <code>app.midominio.com<\/code><\/li>\n<li>Backend en <code>api.midominio.com<\/code><\/li>\n<\/ul>\n<p>Al alojar ambos servicios en un mismo dominio o subdominio, los problemas de origen cruzado se reducen significativamente, y la gesti\u00f3n de cookies es m\u00e1s directa, lo cual puede simplificar la autenticaci\u00f3n y la gesti\u00f3n de CSRF.<\/p>\n<h2>Resultado Final<\/h2>\n<p>Con esta configuraci\u00f3n avanzada, Axios puede gestionar de manera segura los tokens CSRF y de autorizaci\u00f3n en aplicaciones con arquitecturas cross-domain, adapt\u00e1ndose a los cambios introducidos a partir de Axios 1.5.1. Recuerda que tambi\u00e9n es importante revisar las opciones de configuraci\u00f3n del servidor para garantizar la compatibilidad de CORS y CSRF en todo el flujo de autenticaci\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n<h3>Contacto<\/h3>\n<p>Si necesitas servicios de desarrollo para tu empresa , estoy aqu\u00ed para ayudarte. Ofrezco soluciones personalizadas y de alta calidad para satisfacer tus necesidades. Para m\u00e1s informaci\u00f3n o para discutir tu proyecto, cont\u00e1ctame a traves del siguiente bot\u00f3n<\/p>\n<p style=\"text-align: center;\"><button translate=\"no\" class=\"btg-button btg-button-1\" data-btnid=\"1\" data-url=\"https:\/\/alexpadulles.es\/#contact\" data-action=\"link\" data-target=\"_self\">Contacta con nosotros<span class=\"fas fa-message btg-icon \"><\/span><\/button>\n<p>&nbsp;<\/p>\n<p>Imagenes obtenidas en : <a href=\"https:\/\/www.freepik.com\/\">Image by Freepik<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda Completa para Configurar Sanctum CSRF-Cookie y Autenticaci\u00f3n en Axios (v1.7) Axios es una popular biblioteca&#8230;<\/p>\n","protected":false},"author":1,"featured_media":661,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,5,9],"tags":[164,163],"class_list":["post-659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","category-laravel-y-vue","category-vue","tag-error-419","tag-laravel-sanctum-csrf-cookie"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Laravel Sanctum CSRF-Cookie; http error: 419 - Blog Desarrrollo web Alex Padulles<\/title>\n<meta name=\"description\" content=\"Error 419 Laravel Sanctum CSRF-Cookie; Te voy a contar como solucionar este error y porque pasa, te mostrar\u00e9 lo que me ha funcionado a mi.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel Sanctum CSRF-Cookie; http error: 419 - Blog Desarrrollo web Alex Padulles\" \/>\n<meta property=\"og:description\" content=\"Error 419 Laravel Sanctum CSRF-Cookie; Te voy a contar como solucionar este error y porque pasa, te mostrar\u00e9 lo que me ha funcionado a mi.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Desarrrollo web Alex Padulles\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-30T13:18:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Alex Padull\u00e9s\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@alexpadulles\" \/>\n<meta name=\"twitter:site\" content=\"@alexpadulles\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alex Padull\u00e9s\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Laravel Sanctum CSRF-Cookie; http error: 419 - Blog Desarrrollo web Alex Padulles","description":"Error 419 Laravel Sanctum CSRF-Cookie; Te voy a contar como solucionar este error y porque pasa, te mostrar\u00e9 lo que me ha funcionado a mi.","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:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/","og_locale":"es_ES","og_type":"article","og_title":"Laravel Sanctum CSRF-Cookie; http error: 419 - Blog Desarrrollo web Alex Padulles","og_description":"Error 419 Laravel Sanctum CSRF-Cookie; Te voy a contar como solucionar este error y porque pasa, te mostrar\u00e9 lo que me ha funcionado a mi.","og_url":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/","og_site_name":"Blog Desarrrollo web Alex Padulles","article_published_time":"2024-10-30T13:18:37+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg","type":"image\/jpeg"}],"author":"Alex Padull\u00e9s","twitter_card":"summary_large_image","twitter_creator":"@alexpadulles","twitter_site":"@alexpadulles","twitter_misc":{"Written by":"Alex Padull\u00e9s","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#article","isPartOf":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/"},"author":{"name":"Alex Padull\u00e9s","@id":"https:\/\/alexpadulles.es\/blog\/#\/schema\/person\/e32cd17cd5729478d074e4fdb3212e32"},"headline":"Laravel Sanctum CSRF-Cookie; http error: 419","datePublished":"2024-10-30T13:18:37+00:00","mainEntityOfPage":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/"},"wordCount":996,"commentCount":0,"publisher":{"@id":"https:\/\/alexpadulles.es\/blog\/#\/schema\/person\/e32cd17cd5729478d074e4fdb3212e32"},"image":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#primaryimage"},"thumbnailUrl":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg","keywords":["error 419","Laravel Sanctum CSRF-Cookie"],"articleSection":["laravel","laravel-vue","vue"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/","url":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/","name":"Laravel Sanctum CSRF-Cookie; http error: 419 - Blog Desarrrollo web Alex Padulles","isPartOf":{"@id":"https:\/\/alexpadulles.es\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#primaryimage"},"image":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#primaryimage"},"thumbnailUrl":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg","datePublished":"2024-10-30T13:18:37+00:00","description":"Error 419 Laravel Sanctum CSRF-Cookie; Te voy a contar como solucionar este error y porque pasa, te mostrar\u00e9 lo que me ha funcionado a mi.","breadcrumb":{"@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#primaryimage","url":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg","contentUrl":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/10\/side-shot-code-editor-using-react-js-scaled.jpg","width":2560,"height":1707,"caption":"CSRF desde Axios"},{"@type":"BreadcrumbList","@id":"https:\/\/alexpadulles.es\/blog\/laravel-sanctum-csrf-cookie-http-error-419\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/alexpadulles.es\/blog\/"},{"@type":"ListItem","position":2,"name":"Laravel Sanctum CSRF-Cookie; http error: 419"}]},{"@type":"WebSite","@id":"https:\/\/alexpadulles.es\/blog\/#website","url":"https:\/\/alexpadulles.es\/blog\/","name":"Desarrollor web Alex padulles","description":"Bienvenidos a mi blog, tu portal de referencia en tecnolog\u00eda. Con a\u00f1os de experiencia en programaci\u00f3n y desarrollo web, ofrecemos soluciones innovadoras y personalizadas para todos tus proyectos digitales.","publisher":{"@id":"https:\/\/alexpadulles.es\/blog\/#\/schema\/person\/e32cd17cd5729478d074e4fdb3212e32"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/alexpadulles.es\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/alexpadulles.es\/blog\/#\/schema\/person\/e32cd17cd5729478d074e4fdb3212e32","name":"Alex Padull\u00e9s","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/06\/cropped-openart-image_JlFoPIny_1718750114835_raw.png","url":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/06\/cropped-openart-image_JlFoPIny_1718750114835_raw.png","contentUrl":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/06\/cropped-openart-image_JlFoPIny_1718750114835_raw.png","width":602,"height":481,"caption":"Alex Padull\u00e9s"},"logo":{"@id":"https:\/\/alexpadulles.es\/blog\/wp-content\/uploads\/2024\/06\/cropped-openart-image_JlFoPIny_1718750114835_raw.png"},"sameAs":["https:\/\/alexpadulles.es\/blog","https:\/\/x.com\/alexpadulles"]}]}},"_links":{"self":[{"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/posts\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/comments?post=659"}],"version-history":[{"count":4,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/posts\/659\/revisions"}],"predecessor-version":[{"id":664,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/posts\/659\/revisions\/664"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/media\/661"}],"wp:attachment":[{"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/media?parent=659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/categories?post=659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alexpadulles.es\/blog\/wp-json\/wp\/v2\/tags?post=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}