{"id":267,"date":"2026-05-23T19:56:48","date_gmt":"2026-05-24T02:56:48","guid":{"rendered":"https:\/\/www.mariatech.com.mx\/blog\/?p=267"},"modified":"2026-05-23T20:07:42","modified_gmt":"2026-05-24T03:07:42","slug":"como-implementar-recuperacion-de-contrasena-para-administradores-y-clientes-en-laravel-13","status":"publish","type":"post","link":"https:\/\/www.mariatech.com.mx\/blog\/laravel-php\/como-implementar-recuperacion-de-contrasena-para-administradores-y-clientes-en-laravel-13\/","title":{"rendered":"C\u00f3mo implementar recuperaci\u00f3n de contrase\u00f1a para administradores y clientes en Laravel 13"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En proyectos web con \u00e1reas separadas para administradores y clientes, es com\u00fan que ambos tipos de usuarios necesiten iniciar sesi\u00f3n, cerrar sesi\u00f3n y recuperar su contrase\u00f1a. El reto t\u00e9cnico aparece cuando cada tipo de usuario vive en una tabla diferente y debe tener su propio flujo de autenticaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo veremos c\u00f3mo estructurar un proceso de recuperaci\u00f3n de contrase\u00f1a en Laravel 13 para dos tipos de usuarios: <strong>administradores<\/strong> y <strong>clientes<\/strong>. El objetivo es mantener una arquitectura limpia, segura y f\u00e1cil de mantener.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contexto del problema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Laravel Breeze instala un sistema de autenticaci\u00f3n funcional, pero por defecto est\u00e1 pensado para trabajar principalmente con una sola tabla de usuarios, normalmente <code>users<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, en proyectos m\u00e1s completos podemos necesitar algo como esto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Administradores:<\/strong> usuarios internos del sistema, almacenados en la tabla <code>users<\/code>.<\/li>\n\n\n\n<li><strong>Clientes:<\/strong> usuarios externos que acceden al sitio o portal del cliente, almacenados en la tabla <code>customers<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En este escenario no conviene mezclar ambos tipos de usuario en la misma tabla, porque normalmente tienen permisos, vistas, reglas de negocio y flujos diferentes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Estructura recomendada<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>app\/\n\u251c\u2500\u2500 Http\/\n\u2502   \u251c\u2500\u2500 Controllers\/\n\u2502   \u2502   \u251c\u2500\u2500 Admin\/\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 Auth\/\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 PasswordResetLinkController.php\n\u2502   \u2502   \u2502       \u2514\u2500\u2500 NewPasswordController.php\n\u2502   \u2502   \u2514\u2500\u2500 Customer\/\n\u2502   \u2502       \u2514\u2500\u2500 Auth\/\n\u2502   \u2502           \u251c\u2500\u2500 PasswordResetLinkController.php\n\u2502   \u2502           \u2514\u2500\u2500 NewPasswordController.php\n\nresources\/\n\u251c\u2500\u2500 views\/\n\u2502   \u251c\u2500\u2500 admin\/\n\u2502   \u2502   \u2514\u2500\u2500 auth\/\n\u2502   \u2502       \u251c\u2500\u2500 forgot-password.blade.php\n\u2502   \u2502       \u2514\u2500\u2500 reset-password.blade.php\n\u2502   \u2514\u2500\u2500 customer\/\n\u2502       \u2514\u2500\u2500 auth\/\n\u2502           \u251c\u2500\u2500 forgot-password.blade.php\n\u2502           \u2514\u2500\u2500 reset-password.blade.php\n\nroutes\/\n\u251c\u2500\u2500 admin.php\n\u2514\u2500\u2500 customer.php<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La idea es separar cada flujo para evitar dependencias innecesarias y tener rutas, controladores, vistas y brokers independientes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuraci\u00f3n de autenticaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En <code>config\/auth.php<\/code> podemos definir un guard y un provider para cada tipo de usuario.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nuse App\\Models\\User;\nuse App\\Models\\Customer;\n\nreturn &#91;\n\n    'defaults' =&gt; &#91;\n        'guard' =&gt; 'web',\n        'passwords' =&gt; 'users',\n    ],\n\n    'guards' =&gt; &#91;\n        'web' =&gt; &#91;\n            'driver' =&gt; 'session',\n            'provider' =&gt; 'users',\n        ],\n\n        'customer' =&gt; &#91;\n            'driver' =&gt; 'session',\n            'provider' =&gt; 'customers',\n        ],\n    ],\n\n    'providers' =&gt; &#91;\n        'users' =&gt; &#91;\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; User::class,\n        ],\n\n        'customers' =&gt; &#91;\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; Customer::class,\n        ],\n    ],\n\n    'passwords' =&gt; &#91;\n        'users' =&gt; &#91;\n            'provider' =&gt; 'users',\n            'table' =&gt; 'password_reset_tokens',\n            'expire' =&gt; 60,\n            'throttle' =&gt; 60,\n        ],\n\n        'customers' =&gt; &#91;\n            'provider' =&gt; 'customers',\n            'table' =&gt; 'customer_password_reset_tokens',\n            'expire' =&gt; 60,\n            'throttle' =&gt; 60,\n        ],\n    ],\n\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El punto clave est\u00e1 en la secci\u00f3n <code>passwords<\/code>. Ah\u00ed definimos dos brokers: <code>users<\/code> para administradores y <code>customers<\/code> para clientes. Cada broker usa su propio provider y su propia tabla de tokens.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migraci\u00f3n para tokens de clientes<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Schema::create('customer_password_reset_tokens', function (Blueprint $table) {\n    $table-&gt;string('email')-&gt;primary();\n    $table-&gt;string('token');\n    $table-&gt;timestamp('created_at')-&gt;nullable();\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto permite que el flujo de administradores y clientes quede completamente separado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rutas para administradores<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>use App\\Http\\Controllers\\Admin\\Auth\\PasswordResetLinkController;\nuse App\\Http\\Controllers\\Admin\\Auth\\NewPasswordController;\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::middleware('admin.guest')->group(function () {\n    Route::get('\/forgot-password', &#91;PasswordResetLinkController::class, 'create'])\n        ->name('password.request');\n\n    Route::post('\/forgot-password', &#91;PasswordResetLinkController::class, 'store'])\n        ->name('password.email');\n\n    Route::get('\/reset-password\/{token}', &#91;NewPasswordController::class, 'create'])\n        ->name('password.reset');\n\n    Route::post('\/reset-password', &#91;NewPasswordController::class, 'store'])\n        ->name('password.store');\n});<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Rutas para clientes<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>use App\\Http\\Controllers\\Customer\\Auth\\PasswordResetLinkController;\nuse App\\Http\\Controllers\\Customer\\Auth\\NewPasswordController;\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::middleware('customer.guest')->group(function () {\n    Route::get('\/forgot-password', &#91;PasswordResetLinkController::class, 'create'])\n        ->name('password.request');\n\n    Route::post('\/forgot-password', &#91;PasswordResetLinkController::class, 'store'])\n        ->name('password.email');\n\n    Route::get('\/reset-password\/{token}', &#91;NewPasswordController::class, 'create'])\n        ->name('password.reset');\n\n    Route::post('\/reset-password', &#91;NewPasswordController::class, 'store'])\n        ->name('password.store');\n});<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Controlador para enviar el enlace de recuperaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El controlador encargado de enviar el enlace de recuperaci\u00f3n debe usar el broker correcto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Administrador<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace App\\Http\\Controllers\\Admin\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Validation\\ValidationException;\n\nclass PasswordResetLinkController extends Controller\n{\n    public function create()\n    {\n        return view('admin.auth.forgot-password');\n    }\n\n    public function store(Request $request)\n    {\n        $request-&gt;validate(&#91;\n            'email' =&gt; &#91;'required', 'email'],\n        ]);\n\n        $status = Password::broker('users')-&gt;sendResetLink(\n            $request-&gt;only('email')\n        );\n\n        if ($status === Password::RESET_LINK_SENT) {\n            return back()-&gt;with('status', __($status));\n        }\n\n        throw ValidationException::withMessages(&#91;\n            'email' =&gt; __($status),\n        ]);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace App\\Http\\Controllers\\Customer\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Validation\\ValidationException;\n\nclass PasswordResetLinkController extends Controller\n{\n    public function create()\n    {\n        return view('customer.auth.forgot-password');\n    }\n\n    public function store(Request $request)\n    {\n        $request-&gt;validate(&#91;\n            'email' =&gt; &#91;'required', 'email'],\n        ]);\n\n        $status = Password::broker('customers')-&gt;sendResetLink(\n            $request-&gt;only('email')\n        );\n\n        if ($status === Password::RESET_LINK_SENT) {\n            return back()-&gt;with('status', __($status));\n        }\n\n        throw ValidationException::withMessages(&#91;\n            'email' =&gt; __($status),\n        ]);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El cambio central es el broker:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Password::broker('users')      \/\/ Administradores\nPassword::broker('customers')  \/\/ Clientes<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Controlador para actualizar la contrase\u00f1a<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Administrador<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace App\\Http\\Controllers\\Admin\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Auth\\Events\\PasswordReset;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\Validation\\Rules;\n\nclass NewPasswordController extends Controller\n{\n    public function create(Request $request)\n    {\n        return view('admin.auth.reset-password', &#91;\n            'request' =&gt; $request,\n        ]);\n    }\n\n    public function store(Request $request)\n    {\n        $request-&gt;validate(&#91;\n            'token' =&gt; &#91;'required'],\n            'email' =&gt; &#91;'required', 'email'],\n            'password' =&gt; &#91;'required', 'confirmed', Rules\\Password::defaults()],\n        ]);\n\n        $status = Password::broker('users')-&gt;reset(\n            $request-&gt;only('email', 'password', 'password_confirmation', 'token'),\n            function ($user) use ($request) {\n                $user-&gt;forceFill(&#91;\n                    'password' =&gt; Hash::make($request-&gt;password),\n                    'remember_token' =&gt; Str::random(60),\n                ])-&gt;save();\n\n                event(new PasswordReset($user));\n            }\n        );\n\n        return $status === Password::PASSWORD_RESET\n            ? redirect()-&gt;route('admin.login')-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))\n                -&gt;withErrors(&#91;'email' =&gt; __($status)]);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace App\\Http\\Controllers\\Customer\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Auth\\Events\\PasswordReset;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\Validation\\Rules;\n\nclass NewPasswordController extends Controller\n{\n    public function create(Request $request)\n    {\n        return view('customer.auth.reset-password', &#91;\n            'request' =&gt; $request,\n        ]);\n    }\n\n    public function store(Request $request)\n    {\n        $request-&gt;validate(&#91;\n            'token' =&gt; &#91;'required'],\n            'email' =&gt; &#91;'required', 'email'],\n            'password' =&gt; &#91;'required', 'confirmed', Rules\\Password::defaults()],\n        ]);\n\n        $status = Password::broker('customers')-&gt;reset(\n            $request-&gt;only('email', 'password', 'password_confirmation', 'token'),\n            function ($customer) use ($request) {\n                $customer-&gt;forceFill(&#91;\n                    'password' =&gt; Hash::make($request-&gt;password),\n                    'remember_token' =&gt; Str::random(60),\n                ])-&gt;save();\n\n                event(new PasswordReset($customer));\n            }\n        );\n\n        return $status === Password::PASSWORD_RESET\n            ? redirect()-&gt;route('customer.login')-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))\n                -&gt;withErrors(&#91;'email' =&gt; __($status)]);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Personalizar la URL del correo de recuperaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un detalle importante es que Laravel genera el enlace de recuperaci\u00f3n usando una notificaci\u00f3n. Si no personalizamos ese enlace, puede terminar enviando al usuario al flujo equivocado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para resolverlo, podemos agregar la l\u00f3gica en <code>app\/Providers\/AppServiceProvider.php<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace App\\Providers;\n\nuse App\\Models\\Customer;\nuse App\\Models\\User;\nuse Illuminate\\Auth\\Notifications\\ResetPassword;\nuse Illuminate\\Support\\Facades\\URL;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    public function register(): void\n    {\n        \/\/\n    }\n\n    public function boot(): void\n    {\n        ResetPassword::createUrlUsing(function (object $notifiable, string $token): string {\n            if ($notifiable instanceof Customer) {\n                return URL::route('customer.password.reset', &#91;\n                    'token' =&gt; $token,\n                    'email' =&gt; $notifiable-&gt;getEmailForPasswordReset(),\n                ]);\n            }\n\n            if ($notifiable instanceof User) {\n                return URL::route('admin.password.reset', &#91;\n                    'token' =&gt; $token,\n                    'email' =&gt; $notifiable-&gt;getEmailForPasswordReset(),\n                ]);\n            }\n\n            return URL::route('customer.password.reset', &#91;\n                'token' =&gt; $token,\n                'email' =&gt; $notifiable-&gt;getEmailForPasswordReset(),\n            ]);\n        });\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con esto, cuando el modelo sea <code>User<\/code>, Laravel enviar\u00e1 al flujo de administrador. Cuando el modelo sea <code>Customer<\/code>, enviar\u00e1 al flujo de cliente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vistas de recuperaci\u00f3n de contrase\u00f1a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En cada formulario es importante apuntar a la ruta correcta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Formulario para solicitar enlace<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Administrador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form method=\"POST\" action=\"{{ route('admin.password.email') }}\">\n    @csrf\n    &lt;input type=\"email\" name=\"email\" required>\n    &lt;button type=\"submit\">\n        Enviar enlace\n    &lt;\/button>\n&lt;\/form><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cliente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form method=\"POST\" action=\"{{ route('customer.password.email') }}\">\n    @csrf\n    &lt;input type=\"email\" name=\"email\" required>\n    &lt;button type=\"submit\">\n        Enviar enlace\n    &lt;\/button>\n&lt;\/form><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Formulario para crear nueva contrase\u00f1a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Administrador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form method=\"POST\" action=\"{{ route('admin.password.store') }}\">\n    @csrf\n    &lt;input type=\"hidden\" name=\"token\" value=\"{{ $request->route('token') }}\">\n    &lt;input type=\"email\" name=\"email\" value=\"{{ old('email', $request->email) }}\" required>\n    &lt;input type=\"password\" name=\"password\" required>\n    &lt;input type=\"password\" name=\"password_confirmation\" required>\n    &lt;button type=\"submit\">\n        Actualizar contrase\u00f1a\n    &lt;\/button>\n&lt;\/form><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cliente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form method=\"POST\" action=\"{{ route('customer.password.store') }}\">\n    @csrf\n    &lt;input type=\"hidden\" name=\"token\" value=\"{{ $request->route('token') }}\">\n    &lt;input type=\"email\" name=\"email\" value=\"{{ old('email', $request->email) }}\" required>\n    &lt;input type=\"password\" name=\"password\" required>\n    &lt;input type=\"password\" name=\"password_confirmation\" required>\n    &lt;button type=\"submit\">\n        Actualizar contrase\u00f1a\n    &lt;\/button>\n&lt;\/form><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Buenas pr\u00e1cticas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usar modelos separados cuando los usuarios internos y externos tienen responsabilidades diferentes.<\/li>\n\n\n\n<li>Separar rutas, vistas y controladores por tipo de usuario.<\/li>\n\n\n\n<li>Usar un broker de contrase\u00f1a diferente para cada tabla.<\/li>\n\n\n\n<li>Personalizar la URL del correo para evitar que el usuario llegue al flujo equivocado.<\/li>\n\n\n\n<li>No depender completamente de la estructura por defecto de Breeze cuando el proyecto requiere m\u00faltiples \u00e1reas de autenticaci\u00f3n.<\/li>\n\n\n\n<li>Mantener nombres claros como <code>Admin<\/code> y <code>Customer<\/code> para facilitar el mantenimiento.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La recuperaci\u00f3n de contrase\u00f1a para m\u00faltiples tipos de usuarios en Laravel requiere separar correctamente guards, providers, brokers, rutas, controladores y vistas. Aunque Breeze ofrece una buena base inicial, en proyectos con administradores y clientes conviene tomar el control del flujo para evitar cruces entre autenticaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave est\u00e1 en usar un broker distinto para cada tipo de usuario:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Password::broker('users')      \/\/ Administradores\nPassword::broker('customers')  \/\/ Clientes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y personalizar el enlace generado por correo desde <code>AppServiceProvider<\/code>, para que cada usuario llegue al formulario correcto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con esta estructura, el sistema queda m\u00e1s limpio, seguro y preparado para crecer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Si te ha servido de algo este art\u00edculo no olvides dejarnos un comentario!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo veremos c\u00f3mo estructurar un proceso de recuperaci\u00f3n de contrase\u00f1a en Laravel para dos tipos de usuarios: administradores y clientes.<\/p>\n","protected":false},"author":1,"featured_media":268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel-php"],"_links":{"self":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=267"}],"version-history":[{"count":0,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/posts\/267\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media\/268"}],"wp:attachment":[{"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mariatech.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}