{"id":64480,"date":"2023-03-30T15:41:02","date_gmt":"2023-03-30T13:41:02","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=64480&#038;preview=true&#038;preview_id=64480"},"modified":"2025-09-01T17:51:48","modified_gmt":"2025-09-01T15:51:48","slug":"autenticacion-laravel","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/","title":{"rendered":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel"},"content":{"rendered":"<p>La autenticaci\u00f3n es una de las caracter\u00edsticas m\u00e1s cr\u00edticas y esenciales de las aplicaciones web. Los marcos de trabajo web como Laravel proporcionan muchas formas para que los usuarios se autentiquen.<\/p>\n<p>Puedes implementar las funciones de autenticaci\u00f3n de Laravel de forma r\u00e1pida y segura. Sin embargo, implementar mal estas funciones de autenticaci\u00f3n puede ser arriesgado, ya que los malintencionados pueden aprovecharse de ellas.<\/p>\n<p>Esta gu\u00eda te ense\u00f1ar\u00e1 todo lo que necesitas saber para empezar a utilizar los m\u00e9todos de autenticaci\u00f3n de Laravel que elijas.<\/p>\n<p>\u00a1Sigue leyendo!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Introducci\u00f3n a la Autenticaci\u00f3n en Laravel<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-laravel\/\">Laravel<\/a> introduce m\u00f3dulos que se componen de \u00abguards\u00bb y \u00ab<a href=\"https:\/\/laravel.com\/docs\/9.x\/providers\">providers<\/a>\u00bb Los guards definen la autenticaci\u00f3n del usuario para cada solicitud, y los providers definen la recuperaci\u00f3n del usuario desde un almacenamiento persistente (por ejemplo, una base de datos <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-mysql\/\">MySQL<\/a> ).<\/p>\n<p>Definimos nuestros par\u00e1metros de autenticaci\u00f3n en un archivo llamado <code>config\/auth.php<\/code>. Incluye varias opciones para ajustar y modificar el comportamiento de autenticaci\u00f3n de Laravel.<\/p>\n<p>En primer lugar, tienes que definir los valores predeterminados de autenticaci\u00f3n. Esta opci\u00f3n controla las opciones predeterminadas de \u00abguard\u00bb de autenticaci\u00f3n y restablecimiento de contrase\u00f1a de tu aplicaci\u00f3n. Puedes cambiar estos valores por defecto seg\u00fan necesites, pero son un comienzo perfecto para la mayor\u00eda de las aplicaciones.<\/p>\n<p>A continuaci\u00f3n, define los guardias de autenticaci\u00f3n para tu aplicaci\u00f3n. Aqu\u00ed, nuestra configuraci\u00f3n por defecto utiliza el almacenamiento de sesiones y el proveedor de usuarios de Eloquent. Todos los controladores de autenticaci\u00f3n tienen un proveedor de usuarios.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nreturn [\n    \/* \n    Defining Authentication Defaults  \n    *\/\n    \n    'defaults' =&gt; [\n        'guard' =&gt; 'web', \n        'passwords' =&gt; 'users',\n    ],\n    \n    \/*\n    Defining Authentication Guards\n   \n    Supported: \"session\"\n    *\/\n\n    'guards' =&gt; [\n        'web' =&gt; [\n            'driver' =&gt; 'session',\n            'provider' =&gt; 'users',\n        ],\n     ],\n    \n    \/*\n    Defining User Providers\n\n    Supported: \"database\", \"eloquent\"\n    *\/\n\n    'providers' =&gt; [\n        'users' =&gt; [\n             'driver' =&gt; 'eloquent',\n             'model' =&gt; App\\Models\\User::class,\n        ], \n\n        \/\/ 'users' =&gt; [\n        \/\/     'driver' =&gt; 'database',\n        \/\/     'table' =&gt; 'users',\n        \/\/ ],\n    ],\n\n    \/*\n    Defining Password Resetting\n    *\/\n\n    'passwords' =&gt; [\n        'users' =&gt; [\n            'provider' =&gt; 'users',\n            'table' =&gt; 'password_resets',\n            'expire' =&gt; 60,\n            'throttle' =&gt; 60,\n         ],\n     ],\n\n     \/*\n     Defining Password Confirmation Timeout\n     *\/\n\n    'password_timeout' =&gt; 10800,\n];<\/code><\/pre>\n<p>M\u00e1s adelante, nos aseguraremos de que todos los controladores de autenticaci\u00f3n tengan un proveedor de usuarios. \u00c9ste define c\u00f3mo se recuperan los usuarios de tu base de datos u otros mecanismos de almacenamiento para persistir los datos de tus usuarios. Puedes configurar varias fuentes que representen a cada modelo o tabla si tienes varias tablas o modelos de usuario. Estas fuentes pueden asignarse a cualquier guardia de autenticaci\u00f3n adicional que hayas definido.<\/p>\n<p>Los usuarios tambi\u00e9n pueden querer restablecer sus contrase\u00f1as. Para ello, puedes especificar m\u00faltiples configuraciones de restablecimiento de contrase\u00f1a si tienes m\u00e1s de una tabla o modelo de usuario en la aplicaci\u00f3n y quieres configuraciones separadas basadas en los tipos de usuario espec\u00edficos. El tiempo de caducidad es el n\u00famero de minutos que ser\u00e1 v\u00e1lido cada token de restablecimiento. Esta funci\u00f3n de seguridad mantiene los tokens de corta duraci\u00f3n, de modo que tienen menos tiempo para ser adivinados. Puedes cambiarlo seg\u00fan necesites.<\/p>\n<p>Por \u00faltimo, debes definir el tiempo que transcurrir\u00e1 antes de que se agote el tiempo de confirmaci\u00f3n de una contrase\u00f1a, y se pida al usuario que vuelva a introducir su contrase\u00f1a a trav\u00e9s de la pantalla de confirmaci\u00f3n. Por defecto, el tiempo de espera dura tres horas.<\/p>\n<h2>Tipos de M\u00e9todos de Autenticaci\u00f3n de Laravel<\/h2>\n<p>No existe un m\u00e9todo perfecto de autenticaci\u00f3n para cada escenario, pero conocerlos te ayudar\u00e1 a tomar mejores decisiones. Esto y c\u00f3mo Laravel est\u00e1 evolucionando con las nuevas caracter\u00edsticas de <a href=\"https:\/\/kinsta.com\/es\/blog\/laravel-9\/\">Laravel 9<\/a>. Esto hace que nuestro trabajo como desarrolladores sea mucho m\u00e1s f\u00e1cil a la hora de cambiar de modo de autenticaci\u00f3n.<\/p>\n<h3>Autenticaci\u00f3n basada en contrase\u00f1a<\/h3>\n<p>Como forma rudimentaria de autenticar a un usuario, todav\u00eda es utilizada por miles de organizaciones, pero teniendo en cuenta el desarrollo actual, se est\u00e1 quedando claramente obsoleta.<\/p>\n<p>Los proveedores deben imponer implementaciones de contrase\u00f1as complejas, garantizando al mismo tiempo una fricci\u00f3n m\u00ednima para el usuario final.<\/p>\n<p>Funciona de forma bastante sencilla, el usuario introduce el nombre y la contrase\u00f1a, y si en la Base de Datos hay una coincidencia entre esos dos, el servidor decide autenticar la solicitud y dejar que el usuario acceda a los recursos durante un tiempo predefinido.<\/p>\n<h3>Autenticaci\u00f3n basada en token<\/h3>\n<p>Esta metodolog\u00eda se utiliza cuando se emite al usuario un token \u00fanico tras la verificaci\u00f3n.<\/p>\n<p>Con este token, el usuario puede acceder a los recursos pertinentes. El privilegio est\u00e1 activo hasta que caduca el token.<\/p>\n<p>Mientras el token est\u00e1 activo, el usuario no tiene que utilizar ning\u00fan nombre de usuario ni contrase\u00f1a, pero al recuperar un nuevo token, se requieren esos dos.<\/p>\n<p>Hoy en d\u00eda, los tokens se utilizan ampliamente en m\u00faltiples escenarios, ya que son entidades sin estado que contienen todos los datos de autenticaci\u00f3n.<\/p>\n<p>Proporcionar una forma de separar la generaci\u00f3n de tokens de su verificaci\u00f3n da a los vendedores mucha flexibilidad.<\/p>\n<h3>Autenticaci\u00f3n multifactor<\/h3>\n<p>Como su nombre indica, implica utilizar al menos dos factores de autenticaci\u00f3n, lo que eleva la seguridad que proporciona.<\/p>\n<p>A diferencia de <a href=\"https:\/\/kinsta.com\/es\/blog\/autenticacion-de-dos-factores\/\">la autenticaci\u00f3n de dos factores,<\/a> que s\u00f3lo implica dos factores, este m\u00e9todo puede implicar dos, tres, cuatro y m\u00e1s..<\/p>\n<p>La implementaci\u00f3n t\u00edpica de este m\u00e9todo implica el uso de una contrase\u00f1a, tras lo cual se env\u00eda al usuario un c\u00f3digo de verificaci\u00f3n a su smartphone. Los proveedores que implementen este m\u00e9todo deben tener cuidado con los falsos positivos y las interrupciones de la red, que pueden convertirse en grandes problemas al escalar r\u00e1pidamente.<\/p>\n<h2>C\u00f3mo Implementar la Autenticaci\u00f3n en Laravel<\/h2>\n<p>Esta secci\u00f3n te ense\u00f1ar\u00e1 m\u00faltiples formas de autenticar a los usuarios de tu aplicaci\u00f3n. Algunas librer\u00edas como Jetstream, Breeze y Socialite tienen <a href=\"https:\/\/kinsta.com\/es\/blog\/tutoriales-laravel\/\">tutoriales gratuitos<\/a> sobre c\u00f3mo utilizarlas.<\/p>\n<h3>Autenticaci\u00f3n manual<\/h3>\n<p>Comenzando con el registro de usuarios y la creaci\u00f3n de las rutas necesarias en <code>routes\/web.php<\/code><strong>.<\/strong><\/p>\n<p>Crearemos dos rutas, una para ver el formulario y otra para registrarse:<\/p>\n<pre><code class=\"language-php\">use AppHttpContrllersAuthRegisterController;\nuse IlluminateSupportFacadesRoute;\n\n\/*\nWeb Routes \n\nRegister web routes for your app's RouteServiceProvider \nin a group containing the \"web\" middleware\n*\/\n\nRoute::get('\/register', [RegisterController::class], 'create']);\n\nRoute::post('\/register', [RegisterController::class], 'store']);<\/code><\/pre>\n<p>Y crearemos el controlador necesario para ellas:<\/p>\n<pre><code class=\"language-bash\">php artisan make controller Auth\/RegisterController -r<\/code><\/pre>\n<p>Ahora actualiza el c\u00f3digo como sigue:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse illuminateHtppRequest;\n\nclass RegisterController extends Controller\n{\n    public function create()\n    {\n        return view('auth.register');\n    }\n\n    public function store(Request $request)\n    {\n    }\n}<\/code><\/pre>\n<p>El controlador est\u00e1 vac\u00edo ahora y devuelve una vista para registrar. Hagamos esa vista en <code>resources\/views\/auth<\/code> y llam\u00e9mosla <code>register.blade.php<\/code>.<\/p>\n<figure style=\"width: 1968px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Register-User.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Register-User.png\" alt=\"Vista de la hoja de Laravel para registrar usuarios.\" width=\"1968\" height=\"1862\"><\/a><figcaption class=\"wp-caption-text\">Vista de la hoja de Laravel para registrar usuarios.<\/figcaption><\/figure>\n<p>Ahora, con todo en su sitio, deber\u00edamos visitar nuestra ruta <code>\/register<\/code> y ver el siguiente formulario:<\/p>\n<figure id=\"attachment_162747\" aria-describedby=\"caption-attachment-162747\" style=\"width: 960px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-162747 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/laravel-authentication-user-login-form.png\" alt=\"Formulario de registro para la autenticaci\u00f3n manual.\" width=\"960\" height=\"264\"><figcaption id=\"caption-attachment-162747\" class=\"wp-caption-text\">Formulario de registro para la autenticaci\u00f3n manual.<\/figcaption><\/figure>\n<p>Ahora que podemos mostrar un formulario que un usuario puede completar y obtener los datos para ello, deber\u00edamos obtener los datos de los usuarios, validarlos y luego almacenarlos en la base de datos si todo est\u00e1 bien. Aqu\u00ed deber\u00edas utilizar una transacci\u00f3n de base de datos para asegurarte de que los datos que insertas est\u00e1n completos.<\/p>\n<p>Utilizaremos la funci\u00f3n de validaci\u00f3n de solicitudes de Laravel para asegurarnos de que se requieren las tres credenciales. Tenemos que asegurarnos de que el correo electr\u00f3nico tiene formato de email y es \u00fanico en la tabla <code>users<\/code> y de que la contrase\u00f1a est\u00e1 confirmada y tiene un m\u00ednimo de 8 caracteres:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateFoundationAuthUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\n\nclass RegisterController extends Controller\n{\n    public function store(Request $request)\n    {\n        \/* \n        Validation\n        *\/\n        $request-&gt;validate([\n            'name' =&gt; 'required',\n            'email' =&gt; 'required|email|unique:users',\n            'password' =&gt; 'required|confirmed|min:8',\n        ]);\n\n        \/*\n        Database Insert\n        *\/\n        $user = User:;create([\n            'name' =&gt; $request-&gt;name,\n            'email' =&gt; $request-&gt;email,\n            'password' =&gt; Hash::make($request-&gt;password),\n        ]);\n\n        return back();\n    }\n\n    public function create()\n    {\n        return view('auth.register');\n    }\n}<\/code><\/pre>\n<p>Ahora que nuestra entrada est\u00e1 validada, cualquier cosa que vaya en contra de nuestra validaci\u00f3n arrojar\u00e1 un error que se mostrar\u00e1 en el formulario:<\/p>\n<figure id=\"attachment_162751\" aria-describedby=\"caption-attachment-162751\" style=\"width: 960px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-162751 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/laravel-authentication-invalid-register-input.png\" alt=\"Ejemplo de entrada no v\u00e1lida para registrarse\" width=\"960\" height=\"168\"><figcaption id=\"caption-attachment-162751\" class=\"wp-caption-text\">Ejemplo de entrada no v\u00e1lida para registrarse<\/figcaption><\/figure>\n<p>Suponiendo que hemos creado una cuenta de usuario en el m\u00e9todo <code>store<\/code>, tambi\u00e9n queremos registrar al usuario. Podemos hacerlo de dos formas. Podemos hacerlo manualmente o utilizar la <strong>fachada Auth<\/strong>.<\/p>\n<p>Despu\u00e9s de que el usuario inicie sesi\u00f3n, no debemos devolverlo a la pantalla de Registro, sino a una nueva p\u00e1gina, como un panel de control o una p\u00e1gina de inicio. Eso es lo que vamos a hacer aqu\u00ed:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse AppProvidersRouteServiceProvider;\nuse IlluminateFoundationAuthUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesAuth;\nuse IlluminateSupportFacadesHash;\n\nclass RegisterController extends Controller\n{\n    public function store(Request $request)\n    {\n        \/* \n        Validation\n        *\/\n        $request-&gt;validate([\n            'name' =&gt; 'required',\n            'email' =&gt; 'required|email|unique:users',\n            'password' =&gt; 'required|confirmed|min:8',\n        ]);\n\n        \/*\n        Database Insert\n        *\/\n        $user = User:;create([\n            'name' =&gt; $request-&gt;name,\n            'email' =&gt; $request-&gt;email,\n            'password' =&gt; Hash::make($request-&gt;password),\n        ]);\n\n        Auth::login($user):\n\n        return redirect(RouteServiceProvider::HOME);\n    }\n\n    public function create()\n    {\n        return view('auth.register');\n    }\n}<\/code><\/pre>\n<p>Y ahora que tenemos un usuario registrado y conectado <code>-n<\/code>, debemos asegurarnos de que puede desconectarse de forma segura.<\/p>\n<p>Laravel sugiere que invalidemos la sesi\u00f3n y regeneremos el token por seguridad despu\u00e9s de un cierre de sesi\u00f3n. Y esto es precisamente lo que vamos a hacer. Empezaremos creando una nueva ruta <code>\/logout<\/code> utilizando el m\u00e9todo<code>destroy<\/code> del <strong>LogoutController<\/strong>:<\/p>\n<pre><code class=\"language-php\">use AppHttpControllersAuthRegisterController;\nuse AppHttpControllersAuthLogoutController;\nuse IlluminateSupportFacadesRoute;\n\n\/*\nWeb Routes\n\nHere is where you can register web routes for your application. These\nroutes are loaded by the RrouteServiceProvider with a group which\ncontains the \"web\" middleware group. Now create something great!\n*\/\n\nRoute::get('\/register', [RegisterController::class, 'create']);\n\nRoute::post('\/register', [RegisterController::class, 'store']);\n\nRoute::post('\/logout', [Logoutcontroller::class, 'destroy'])\n    -&gt;middleware('auth');<\/code><\/pre>\n<p>Pasar el cierre de sesi\u00f3n a trav\u00e9s del middleware <code>auth<\/code> es muy importante. Los usuarios no deben poder acceder a la ruta si no han iniciado sesi\u00f3n.<\/p>\n<p>Ahora, crea un controlador como hicimos antes:<\/p>\n<pre><code class=\"language-bash\">php artisan make:controller Auth\/LogoutController -r<\/code><\/pre>\n<p>Podemos asegurarnos de que obtenemos la solicitud como par\u00e1metro en el m\u00e9todo <code>destroy<\/code>. Cerramos la sesi\u00f3n del usuario a trav\u00e9s de la fachada Auth, invalidamos la sesi\u00f3n y, regeneramos el token, luego redirigimos al usuario a la p\u00e1gina de inicio:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesAuth;\n\nclass LogoutController extends Controller\n{\n    public function destroy(Request $request)\n    { \n        Auth::logout();\n\n        $request-&gt;session()-&gt;invalidate();\n\n        $request-&gt;session()-&gt;regenerateToken();\n \n        return redirect('\/');\n     }\n}<\/code><\/pre>\n<h3>Recordar a los usuarios<\/h3>\n<p>La mayor\u00eda, si no todas, las aplicaciones web modernas proporcionan una casilla de verificaci\u00f3n \u00abrecu\u00e9rdame\u00bb en su formulario de inicio de sesi\u00f3n.<\/p>\n<p>Si queremos proporcionar una funcionalidad \u00abrecu\u00e9rdame\u00bb, podemos pasar un valor booleano como segundo argumento al m\u00e9todo attempt.<\/p>\n<p>Cuando sea v\u00e1lido, Laravel mantendr\u00e1 al usuario autenticado indefinidamente o hasta que se desconecte manualmente. La tabla de usuarios debe incluir la columna string <code>remember_token<\/code> (por eso regeneramos los tokens), donde almacenaremos nuestro token \u00abrecu\u00e9rdame\u00bb.<\/p>\n<p>La migraci\u00f3n por defecto de los usuarios ya la incluye.<\/p>\n<p>Lo primero es lo primero, tienes que a\u00f1adir el campo \u00bb <strong>Remember Me<\/strong> \u00bb a tu formulario:<\/p>\n<figure style=\"width: 1396px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/RememberMe.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/RememberMe.png\" alt=\"A\u00f1adir campo Remember Me.\" width=\"1396\" height=\"596\"><\/a><figcaption class=\"wp-caption-text\">A\u00f1adir campo Remember Me.<\/figcaption><\/figure>\n<p>Y despu\u00e9s de esto, obt\u00e9n las credenciales de la solicitud y util\u00edzalas en el m\u00e9todo attempt de la fachada Auth.<\/p>\n<p>Si el usuario debe ser recordado, iniciaremos sesi\u00f3n con \u00e9l y le redirigiremos a nuestra p\u00e1gina de inicio. En caso contrario, lanzaremos un error:<\/p>\n<pre><code class=\"language-php\">public function store(Request $request)\n{\n    $credentials = $request-&gt;only('email', 'password');\n\n    if (Auth::attempt($credentials, $request-&gt;filled('remember'))) {\n        $request-&gt;session()-&gt;regenerate();\n\n        return redirect()-&gt;intended('\/');\n    }\n\n    return back()-&gt;withErrors([\n        'email' =&gt; 'The provided credentials do not match our records.',\n    ]);\n}<\/code><\/pre>\n<h3>Restablecer contrase\u00f1as<\/h3>\n<p>La mayor\u00eda de las aplicaciones web actuales ofrecen a los usuarios la posibilidad de restablecer sus contrase\u00f1as.<\/p>\n<p>Haremos otra ruta para la contrase\u00f1a olvidada y crearemos el controlador como hicimos. Adem\u00e1s, a\u00f1adiremos una ruta para el enlace de restablecimiento de contrase\u00f1a que contenga el token para todo el proceso:<\/p>\n<pre><code class=\"language-php\">Route::post('\/forgot-password', [ForgotPasswordLinkController::class, 'store']);\n\nRoute::post('\/forgot-password\/{token}', [ForgotPasswordController::class, 'reset']);<\/code><\/pre>\n<p>Dentro del m\u00e9todo store, tomaremos el email de la petici\u00f3n y lo validaremos como hicimos.<\/p>\n<p>Despu\u00e9s de esto, podemos utilizar el m\u00e9todo <code>sendResetLink<\/code> de la fachada de contrase\u00f1a.<\/p>\n<p>Y luego, como respuesta, queremos devolver el estado si se ha conseguido enviar el enlace o errores en caso contrario:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesPassword;\n\nclass ForgotPasswordLinkController extends Controller\n{\n    public function reset(Request $request)\n    {\n        $request-&gt;validate([\n             'email' =&gt; 'required|email',\n        ]);\n\n        $status = Password::sendResetLink(\n            $request-&gt;only('email');\n        );\n\n        return $status === Password::RESET_LINK_SENT\n            ? back()-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))-&gt;withErrors(['email' =&gt; __($status)]);\n     }\n}<\/code><\/pre>\n<p>Ahora que el enlace de restablecimiento se ha enviado al correo electr\u00f3nico del usuario, debemos ocuparnos de la l\u00f3gica de lo que ocurre despu\u00e9s.<\/p>\n<p>Obtendremos el token, el correo electr\u00f3nico y la nueva contrase\u00f1a en la solicitud y los validaremos.<\/p>\n<p>Despu\u00e9s de esto, podemos utilizar el m\u00e9todo de restablecimiento de la fachada de contrase\u00f1a para dejar que Laravel se encargue de todo lo dem\u00e1s entre bastidores.<\/p>\n<p>Siempre haremos un hash de la contrase\u00f1a para mantenerla segura.<\/p>\n<p>Al final, comprobaremos si se ha restablecido la contrase\u00f1a y, en caso afirmativo, redirigiremos al usuario a la pantalla de inicio de sesi\u00f3n con un mensaje de \u00e9xito. En caso contrario, mostraremos un error indicando que no se ha podido restablecer:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\nuse IlluminateSupportFacadesPassword;\nuse IlluminateSupportStr;\n\nclass ForgotPasswordController extends Controller\n{\n    public function store(Request $request)\n    {\n        $request-&gt;validate([\n            'token' =&gt; 'required',\n            'email' =&gt; 'required|email',\n            'password' =&gt; 'required|string|confirmed|min:8',\n        ]);\n\n        $status = Password::reset(\n            $request-&gt;only('email', 'password', 'password_confirmation', 'token'),\n            function ($user) use ($request) {\n                $user-&gt;forceFill(\n                    'password' =&gt; Hash::make($request-&gt;password),\n                    'remember_token' =&gt; Str::random(60)\n                ])-&gt;save();\n            }\n        );\n\n        return $status == Password::PASSWORD_RESET\n            ? redirect()-&gt;route('login')-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))-&gt;withErrors(['email' =&gt; __($status)]);\n    }\n}<\/code><\/pre>\n<h2>Laravel Breeze<\/h2>\n<p>Laravel Breeze es una implementaci\u00f3n sencilla de las funciones de autenticaci\u00f3n de Laravel: inicio de sesi\u00f3n, registro, restablecimiento de contrase\u00f1a, verificaci\u00f3n por correo electr\u00f3nico y confirmaci\u00f3n de contrase\u00f1a. Puedes utilizarla para implementar la autenticaci\u00f3n en tu nueva aplicaci\u00f3n Laravel.<\/p>\n<h3>Instalaci\u00f3n y configuraci\u00f3n<\/h3>\n<p>Despu\u00e9s de crear tu aplicaci\u00f3n Laravel, todo lo que tienes que hacer es configurar tu base de datos, ejecutar tus migraciones e instalar el paquete laravel\/breeze a trav\u00e9s de composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/breeze \u2013dev<\/code><\/pre>\n<p>Despu\u00e9s de esto, ejecuta lo siguiente:<\/p>\n<pre><code class=\"language-bash\">php artisan breeze:install<\/code><\/pre>\n<p>Que publicar\u00e1 tus vistas de autenticaci\u00f3n, rutas, controladores y otros recursos que utilice. Despu\u00e9s de este paso, tendr\u00e1s el control total de todo lo que Breeze proporciona.<\/p>\n<p>Ahora tenemos que renderizar nuestra aplicaci\u00f3n en el frontend, as\u00ed que instalaremos nuestras dependencias JS (que utilizar\u00e1n @vite):<\/p>\n<pre><code class=\"language-php\">npm install<\/code><\/pre>\n<p>:<\/p>\n<pre><code class=\"language-php\">npm run dev<\/code><\/pre>\n<p>Despu\u00e9s de esto, los enlaces de inicio de sesi\u00f3n y registro deber\u00edan aparecer en tu p\u00e1gina de inicio, y todo deber\u00eda funcionar sin problemas.<\/p>\n<h2>Laravel Jetstream<\/h2>\n<p>Laravel Jetstream extiende las funciones de Laravel Breeze con funciones \u00fatiles y otras pilas de frontend.<\/p>\n<p>Proporciona inicio de sesi\u00f3n, registro, verificaci\u00f3n de correo electr\u00f3nico, <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/wordpress-two-factor-authentication\/&#038;sa=D&#038;source=editors&#038;ust=1665232246657389&#038;usg=AOvVaw0_jXtwBiKx5qxPlTHGGCXc\">autenticaci\u00f3n de dos factores<\/a>, gesti\u00f3n de sesiones, compatibilidad con API a trav\u00e9s de Sanctum y gesti\u00f3n de equipos opcional.<\/p>\n<p>Debes elegir entre Livewire e Inertia en el frontend al instalar Jetstream. En el backend, utiliza Laravel Fortify, que es un backend de autenticaci\u00f3n \u00abheadless\u00bb para Laravel, agn\u00f3stico al frontend.<\/p>\n<h3>Instalaci\u00f3n y configuraci\u00f3n<\/h3>\n<p>Lo instalaremos a trav\u00e9s de Composer en nuestro Proyecto Laravel:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/jetstream<\/code><\/pre>\n<p>A continuaci\u00f3n, ejecutaremos el comando <code>php artisan jetstream:install [stack]<\/code>, que acepta los argumentos <code>[stack]<\/code> <code>Livewire<\/code> o <code>Inertia<\/code>. Puedes pasar la opci\u00f3n <code>\u2013team<\/code> para activar la funci\u00f3n de equipos.<\/p>\n<p>Esto tambi\u00e9n instalar\u00e1 Pest <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/scripting-languages\/&#038;sa=D&#038;source=editors&#038;ust=1665232246659068&#038;usg=AOvVaw0OuP24kCNOrcZIHp8-2y_A\">PHP<\/a> para las pruebas.<\/p>\n<p>Y por \u00faltimo, tenemos que renderizar el frontend de nuestra aplicaci\u00f3n utilizando lo siguiente:<\/p>\n<pre><code class=\"language-php\">npm install\nnpm run dev<\/code><\/pre>\n<h2>Laravel Fortify<\/h2>\n<p>Laravel Fortify es una implementaci\u00f3n de autenticaci\u00f3n backend que es agn\u00f3stica al frontend. No tienes que usar Laravel Fortify para implementar las caracter\u00edsticas de autenticaci\u00f3n de Laravel.<\/p>\n<p>Tambi\u00e9n se utiliza en kits de inicio como Breeze y Jetstream. Tambi\u00e9n puedes utilizar Fortify de forma independiente, que no es m\u00e1s que una implementaci\u00f3n de backend. Si lo utilizas de forma independiente, tu frontend debe llamar a las rutas de Fortify.<\/p>\n<h3>Instalaci\u00f3n y configuraci\u00f3n<\/h3>\n<p>Podemos instalar Fortify a trav\u00e9s de Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/fortify<\/code><\/pre>\n<p>Ahora tenemos que publicar los recursos de Fortify:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish \u2013provider=\"LaravelFortifyFortifyServiceProvider\"<\/code><\/pre>\n<p>Despu\u00e9s de esto, crearemos un nuevo directorio <strong>app\/Actions<\/strong>, adem\u00e1s del nuevo <strong>FortifyServiceProvider<\/strong>, el archivo de configuraci\u00f3n y las migraciones de base de datos.<\/p>\n<p>Por \u00faltimo, ejecuta:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate<\/code><\/pre>\n<p>O<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<p>Y tu Fortify est\u00e1 listo para usar.<\/p>\n<h2>Laravel Socialite<\/h2>\n<p>Laravel incluye una sencilla funci\u00f3n de autenticaci\u00f3n de usuarios basada en OAuth. Acepta inicios de sesi\u00f3n de redes sociales a trav\u00e9s de Facebook, <a href=\"https:\/\/kinsta.com\/es\/blog\/estadisticas-twitter\/\">Twitter<\/a>, <a href=\"https:\/\/kinsta.com\/es\/blog\/estadisticas-de-linkedin\/\">LinkedIn<\/a>, Google, <a href=\"https:\/\/kinsta.com\/es\/blog\/git-para-desarrollo-web\/\">Bitbucket, GitHub y GitLab<\/a>.<\/p>\n<h3>Instalaci\u00f3n<\/h3>\n<p>Podemos instalarlo a trav\u00e9s de Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/socialite<\/code><\/pre>\n<h3>Instalaci\u00f3n y uso<\/h3>\n<p>Despu\u00e9s de instalarlo, tenemos que a\u00f1adir las credenciales para el proveedor OAuth que utiliza nuestra aplicaci\u00f3n. Las a\u00f1adiremos en <strong>config\/services.php<\/strong> para cada servicio.<\/p>\n<p>En la configuraci\u00f3n, debemos hacer coincidir la clave con los servicios anteriores. Algunas de esas claves son<\/p>\n<ul>\n<li>facebook<\/li>\n<li>twitter (Para OAuth 1.0)<\/li>\n<li>twitter-oauth-2 (Para OAuth 2.0)<\/li>\n<li>linkedin<\/li>\n<li>google<\/li>\n<li>github<\/li>\n<li>gitlab<\/li>\n<li>bitbucket<\/li>\n<\/ul>\n<p>La configuraci\u00f3n de un servicio puede tener este aspecto<\/p>\n<pre><code class=\"language-php\">'google' =&gt; [\n    'client_id' =&gt; env(\"GOOGLE_CLIENT_ID\"),\n    'client_secret' =&gt; env(\"GOOGLE_CLIENT_SECRET\"),\n    'redirect' =&gt; \"http:\/\/example.com\/callback-url\",\n],<\/code><\/pre>\n<h3>Autenticar usuarios<\/h3>\n<p>Para esta acci\u00f3n, necesitaremos dos rutas, una para redirigir al usuario al proveedor de OAuth:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSociliate;\n\nRoute::get('\/auth\/redirect', function () {\n    return Socialite:;driver('google')-&gt;redirect();\n});<\/code><\/pre>\n<p>Y otra para la llamada de retorno del proveedor tras la autenticaci\u00f3n:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\nRoute:;get('\/auht\/callback', function () {\n    $user = Socialite:;driver('google')-&gt;user();\n\n    \/\/ Getting the user data\n    $user-&gt;token;\n});<\/code><\/pre>\n<p>Socialite proporciona el m\u00e9todo de redirecci\u00f3n, y la fachada redirige al usuario al proveedor de OAuth, mientras que el m\u00e9todo de usuario examina la solicitud entrante y recupera la informaci\u00f3n del usuario.<\/p>\n<p>Despu\u00e9s de recibir nuestro usuario, tenemos que comprobar si existe en nuestra base de datos y autenticarlo. Si no existe, crearemos un nuevo registro para representar al usuario:<\/p>\n<pre><code class=\"language-php\">use AppModelsUser;\nuse IlluminateSupportFacadesAuth;\nuse LaravelSocialiteFacadesSocialite;\n\nRoute::get('\/auth\/callback', function () {\n   \/*\n   Get the user\n   *\/\n   $googleUser = Socialite::driver('google')-&gt;user();\n   \n   \/*\n   Create the user if it does not exist\n   Update the user if it exists\n   \n   Check for google_id in database\n   *\/\n   $user = User::updateOrCreate([\n       'google_id' =&gt; $googleUser-&gt;id,\n   ], [\n       'name' =&gt; $googleUser-&gt;name,\n       'email' =&gt; $googleUser-&gt;email,\n       'google_token' =&gt; $googleUser-&gt;token,\n       'google_refresh_token' =&gt; $googleUser-&gt;refreshToken,\n   ]);\n\n   \/*\n   Authenticates the user using the Auth facade\n   *\/\n    Auth::login($user);\n   \n    return redirect('\/dashboard');\n});<\/code><\/pre>\n<p>Si queremos limitar los \u00e1mbitos de acceso del usuario, podemos utilizar el m\u00e9todo <code>scopes<\/code>, que incluiremos con la solicitud de autenticaci\u00f3n. Esto fusionar\u00e1 todos los \u00e1mbitos especificados anteriormente con los especificados.<\/p>\n<p>Una alternativa a esto es utilizar el m\u00e9todo <code>setScopes<\/code>, que sobrescribe cualquier otro \u00e1mbito existente:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\nreturn Socialite::driver('google')\n    -&gt;scopes(['read:user', 'write:user', 'public_repo'])\n    -&gt;redirect();\n\nreturn Socialite::driver('google')\n    -&gt;setScopes(['read:user', 'public_repo')\n    -&gt;redirect();<\/code><\/pre>\n<p>Ahora que lo sabemos todo y c\u00f3mo obtener un usuario tras la llamada de retorno, veamos algunos de los datos que podemos obtener de \u00e9l.<\/p>\n<p>Usuario OAuth1 tiene <code>token<\/code> y <code>tokenSecret<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$token = $user-&gt;token;\n$tokenSecret = $user-&gt;tokenSecret;<\/code><\/pre>\n<p>OAuth2 proporciona <code>token<\/code>, <code>refreshToken<\/code>, y <code>expiresIn<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$token = $user-&gt;token;\n$refreshToken = $user-&gt;refreshToken;\n$expiresIn = $user-&gt;expiresIn;<\/code><\/pre>\n<p>Tanto OAuth1 como OAuth2 proporcionan <code>getId<\/code>, <code>getNickname<\/code>, <code>getName<\/code>, <code>getEmail<\/code>, y <code>getAvatar<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$user-&gt;getId();\n$user-&gt;getNickName();\n$user-&gt;getName();\n$user-&gt;getEmail();\n$user-&gt;getAvatar();<\/code><\/pre>\n<p>Y si queremos obtener detalles del usuario a partir de un token (OAuth 2) o de un token y un secreto (OAuth 1), sanctum proporciona dos m\u00e9todos para ello: <code>userFromToken<\/code> y <code>userFromTokenAndSecret<\/code>:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\n$user = Socialite:;driver('google')-&gt;userFromToken($token);\n$user = Socialite::driver('twitter')-&gt;userFromTokenAndSecret($token, $secret);<\/code><\/pre>\n<h2>Laravel Sanctum<\/h2>\n<p>Laravel Sanctum es un sistema de autenticaci\u00f3n ligero para SPA (Single Page Applications) y aplicaciones m\u00f3viles. Permite a los usuarios generar m\u00faltiples tokens de API con \u00e1mbitos espec\u00edficos. Estos \u00e1mbitos especifican las acciones permitidas por un token.<\/p>\n<h3>Usos<\/h3>\n<p>Sanctum puede utilizarse para emitir tokens de API al usuario sin las complejidades de OAuth. Esos tokens suelen tener tiempos de caducidad largos, como a\u00f1os, pero pueden ser revocados y regenerados por el usuario en cualquier momento.<\/p>\n<h3>Instalaci\u00f3n y configuraci\u00f3n<\/h3>\n<p>Podemos instalarlo mediante Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/sanctum<\/code><\/pre>\n<p>Y tenemos que publicar los archivos de configuraci\u00f3n y migraci\u00f3n:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish \u2013provider=\"LaravelSanctumSanctumServiceProvider\"<\/code><\/pre>\n<p>Ahora que hemos generado nuevos archivos de migraci\u00f3n, tenemos que migrarlos:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate &lt;\/code&gt; or &lt;code&gt; php artisan migrate:fresh<\/code><\/pre>\n<h3>C\u00f3mo emitir tokens de API<\/h3>\n<p>Antes de emitir tokens, nuestro modelo de Usuario debe utilizar el rasgo <strong>Laravel\\Sanctum\\HasApiTokens<\/strong>:<\/p>\n<pre><code class=\"language-php\">use LaravelSanctumHasApiTokens;\n\nclass User extends Authenticable\n{\n    use HasApiTokens;\n}<\/code><\/pre>\n<p>Cuando tengamos el usuario, podemos emitir un token llamando al m\u00e9todo <code>createToken<\/code>, que devuelve una instancia <strong>Laravel\\Sanctum\\NewAccessToken<\/strong>.<\/p>\n<p>Podemos llamar al m\u00e9todo <code>plainTextToken<\/code> en la instancia <strong>NewAccessToken<\/strong> para ver el valor en texto plano <strong>SHA-256<\/strong> del token.<\/p>\n<h2>Consejos y Buenas Pr\u00e1cticas para la Autenticaci\u00f3n en Laravel<\/h2>\n<h3>Invalidar sesiones en otros dispositivos<\/h3>\n<p>Como hemos comentado anteriormente, invalidar la sesi\u00f3n es crucial cuando el usuario cierra la sesi\u00f3n, pero eso tambi\u00e9n deber\u00eda estar disponible como opci\u00f3n para todos los dispositivos propios.<\/p>\n<p>Esta funci\u00f3n se suele utilizar cuando el usuario cambia o actualiza su contrase\u00f1a, y queremos invalidar su sesi\u00f3n desde cualquier otro dispositivo.<\/p>\n<p>Con la fachada Auth, esto es una tarea f\u00e1cil de conseguir. Teniendo en cuenta que la ruta que estamos utilizando tiene los m\u00e9todos <code>auth<\/code> y <code>auth.session middleware<\/code>, podemos utilizar el m\u00e9todo est\u00e1tico <code>logoutOtherDevices<\/code> de la fachada:<\/p>\n<pre><code class=\"language-php\">Route::get('\/logout', [LogoutController::class, 'invoke'])\n    -&gt;middleware(['auth', 'auth.session']);\n\n<\/code><\/pre>\n<pre><code class=\"language-php\">use IlluminateSupportFacadesAuth;\n\nAuth::logoutOtherDevices($password);<\/code><\/pre>\n<h3>Configuraci\u00f3n con Auth::routes()<\/h3>\n<p>El m\u00e9todo routes de la fachada Auth es s\u00f3lo un ayudante para generar todas las rutas necesarias para la autenticaci\u00f3n de usuarios.<\/p>\n<p>Las rutas incluyen Iniciar sesi\u00f3n (Get, Post), Cerrar sesi\u00f3n (Post), Registrarse (Get, Post) y Restablecer contrase\u00f1a\/correo electr\u00f3nico (Get, Post).<\/p>\n<p>Cuando llamas al m\u00e9todo de la fachada, \u00e9sta hace lo siguiente:<\/p>\n<pre><code class=\"language-php\">public static fucntion routes(array $options = [])\n{\n    if (!static::$app-&gt;providerIsLoaded(UiServiceProvider::class)) {\n        throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel\/ui package.');\n    }\n   \n    static::$app-&gt;make('router')-&gt;auth($options);\n}<\/code><\/pre>\n<p>Nos interesa saber qu\u00e9 ocurre cuando se llama al m\u00e9todo est\u00e1tico en el router. Esto puede ser complicado debido al hecho de c\u00f3mo funcionan las fachadas, pero el siguiente m\u00e9todo llamado es as\u00ed:<\/p>\n<pre><code class=\"language-php\">\/**\nRegister the typical authentication routes for an application.\n\n@param array $options\n@return void\n*\/\npublic function auth(array $options = [])\n{\n    \/\/ Authentication Routes...\n    $this-&gt;get('login', 'AuthLoginController@showLoginForm')-&gt;name('login');\n    $this-&gt;post('login', 'AuthLoginController@login');\n    $this-&gt;post('logout', 'AuthLoginController@logout')-&gt;name('logout');\n\n    \/\/ Registration Routes...\n    if ($options['register'] ?? true) {\n        $this-&gt;get('register', 'AuthRegisterController@showRegistrationForm')-&gt;name('register');\n        $this-&gt;post('register', 'AuthRegisterController@register');\n    }\n   \n    \/\/ Password Reset Routes...\n    if ($options['reset'] ?? true) {\n        $this-&gt;resetPassword();\n    }\n\n    \/\/ Email Verification Routes...\n    if ($options['verify'] ?? false) {\n        $this-&gt;emailVerification();\n    }\n}   <\/code><\/pre>\n<p>Por defecto, genera todas las rutas excepto la de verificaci\u00f3n de correo electr\u00f3nico. Siempre tendremos las rutas Login y Logout, pero las dem\u00e1s las podemos controlar a trav\u00e9s del array de opciones.<\/p>\n<p>Si queremos tener s\u00f3lo login\/logout y registro, podemos pasar el siguiente array de opciones:<\/p>\n<pre><code class=\"language-php\">$options = [\"register\" =&gt; true, \"reset\" =&gt; false, \"verify\" =&gt; false];<\/code><\/pre>\n<h3>Proteger rutas y guardias personalizadas<\/h3>\n<p>Queremos asegurarnos de que s\u00f3lo los usuarios autenticados pueden acceder a algunas rutas y esto se puede hacer r\u00e1pidamente a\u00f1adiendo una llamada al m\u00e9todo middleware en la fachada Ruta o encadenando el m\u00e9todo middleware en ella:<\/p>\n<pre><code class=\"language-php\">Route::middleware('auth')-&gt;get('\/user', function (Request $request) {\n    return $request-&gt;user();\n});\n\nRoute::get('\/user', function (Request $request) {\n    return $request-&gt;user();\n})-&gt;middleware('auth');<\/code><\/pre>\n<p>Esta guardia garantiza que las peticiones entrantes est\u00e9n autenticadas.<\/p>\n<h3>Confirmaci\u00f3n de contrase\u00f1a<\/h3>\n<p>Para mayor <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/website-security-check\/&#038;sa=D&#038;source=editors&#038;ust=1665232246677644&#038;usg=AOvVaw0bmAaBiRrNMk9bLYHwv1jZ\">seguridad del sitio web<\/a>, a menudo querr\u00e1s confirmar la contrase\u00f1a de un usuario antes de continuar con cualquier otra tarea.<\/p>\n<p>Debemos definir una ruta desde la vista de confirmaci\u00f3n de contrase\u00f1a para gestionar la solicitud. Validar\u00e1 y redirigir\u00e1 al usuario a su destino. Al mismo tiempo, nos aseguraremos de que nuestra contrase\u00f1a aparezca confirmada en la sesi\u00f3n. Por defecto, la contrase\u00f1a debe reconfirmarse cada tres horas, pero esto puede cambiarse en el archivo de configuraci\u00f3n en <strong>config\/auth.php<\/strong>:<\/p>\n<pre><code class=\"language-php\">use IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\nuse IlluminateSupportFacadesRedirect;\n\nRoute::post('\/confirm-password', function (Request $request) {\n    if (!Hash::check($request-&gt;password, $request-&gt;user()-&gt;password)) {\n        return back()-&gt;withErrors([\n            'password' =&gt; ['The provided password does not match our records.']\n        ]);\n    }\n\n    $request-&gt;session()-&gt;passwordConfirmed();\n\n    return redirect()-&gt;intended();\n})-&gt;middleware(['auth']);<\/code><\/pre>\n<h3>Contrato Autenticable<\/h3>\n<p>El contrato Autenticable situado en IlluminateContractsAuth define un modelo de lo que debe implementar la fachada UserProvider:<\/p>\n<pre><code class=\"language-php\">namespace IlluminateContractsAuth;\n\ninterface Authenticable \n{\n    public function getAuthIdentifierName();\n    \n    public function getAuthIdentifier();\n    \n    public function getAuthPassord();\n  \n    public function getRememberToken();\n\n    public function setRememberToken($value);\n  \n    public function getrememberTokenName();\n}<\/code><\/pre>\n<p>La interfaz permite al sistema de autenticaci\u00f3n trabajar con cualquier clase de \u00abusuario\u00bb que la implemente.<\/p>\n<p>Esto es v\u00e1lido independientemente de qu\u00e9 ORM o capas de almacenamiento se utilicen. Por defecto, Laravel tiene el AppModelsUser que implementa esta interfaz, y esto tambi\u00e9n se puede ver en el archivo de configuraci\u00f3n:<\/p>\n<pre><code class=\"language-php\">return [\n    'providers' =&gt; [\n        'users' =&gt; [\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; AppModelsUser::class,\n        ],\n     ],\n];<\/code><\/pre>\n<h3>Eventos de autenticaci\u00f3n<\/h3>\n<p>Hay un mont\u00f3n de eventos que se env\u00edan durante todo el proceso de autenticaci\u00f3n.<\/p>\n<p>Dependiendo de tus objetivos, puedes adjuntar oyentes a esos eventos en tu <code>EventServiceProvider<\/code> .<\/p>\n<figure style=\"width: 1003px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Listeners.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Listeners.png\" alt=\"Una lista de escuchadores de Laravel generados para nuestro servicio de autenticaci\u00f3n\" width=\"1003\" height=\"1999\"><\/a><figcaption class=\"wp-caption-text\">Una lista de escuchadores de Laravel generados para nuestro servicio de autenticaci\u00f3n<\/figcaption><\/figure>\n<h3>Crear r\u00e1pidamente nuevos usuarios<\/h3>\n<p>Crear un nuevo usuario r\u00e1pidamente se puede hacer a trav\u00e9s del <strong>App\\User<\/strong>:<\/p>\n<pre><code class=\"language-php\">$user = new AppUser();\n$user-&gt;password = Hash::make('strong_password');\n$user-&gt;email = 'test-email@user.com';\n$user-&gt;name = 'Username';\n$user-&gt;save();<\/code><\/pre>\n<p>O a trav\u00e9s del m\u00e9todo est\u00e1tico crear de la fachada Usuario:<\/p>\n<pre><code class=\"language-php\">User::create([\n 'password' =&gt; Hash::make('strong-password'),\n 'email' =&gt; 'test-email@user.com',\n 'name' =&gt; 'username'\n]);<\/code><\/pre>\n<h2>Resumen<\/h2>\n<p>El ecosistema Laravel tiene un mont\u00f3n de kits de inicio para poner en marcha tu aplicaci\u00f3n con un sistema de autenticaci\u00f3n, como Breeze y Jetstream. Son altamente personalizables, ya que el c\u00f3digo se genera en nuestro lado, y podemos modificarlo tanto como queramos, us\u00e1ndolo como modelo si es necesario.<\/p>\n<p>Hay muchos problemas de seguridad relacionados con la autenticaci\u00f3n y sus entresijos, pero todos ellos pueden resolverse f\u00e1cilmente mediante las herramientas que proporciona Laravel. Estas herramientas son altamente personalizables y f\u00e1ciles de usar.<\/p>\n<p>Despliega tus aplicaciones Laravel de forma r\u00e1pida y eficaz con nuestro r\u00e1pido servicio de alojamiento Laravel. Ve tu aplicaci\u00f3n en acci\u00f3n con una <a href=\"https:\/\/kinsta.com\/es\/suscripcion\/?product_type=app-db\">prueba gratuita<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La autenticaci\u00f3n es una de las caracter\u00edsticas m\u00e1s cr\u00edticas y esenciales de las aplicaciones web. Los marcos de trabajo web como Laravel proporcionan muchas formas para &#8230;<\/p>\n","protected":false},"author":267,"featured_media":64481,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1303],"class_list":["post-64480","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel"],"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>Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel<\/title>\n<meta name=\"description\" content=\"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel\" \/>\n<meta property=\"og:description\" content=\"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\" \/>\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-03-30T13:41:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-01T15:51:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.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=\"Coman Cosmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.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=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel\",\"datePublished\":\"2023-03-30T13:41:02+00:00\",\"dateModified\":\"2025-09-01T15:51:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\"},\"wordCount\":3489,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\",\"name\":\"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg\",\"datePublished\":\"2023-03-30T13:41:02+00:00\",\"dateModified\":\"2025-09-01T15:51:48+00:00\",\"description\":\"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.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:\/\/kinsta.com\/es\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"caption\":\"Coman Cosmin\"},\"description\":\"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel","description":"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.","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:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/","og_locale":"es_ES","og_type":"article","og_title":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel","og_description":"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.","og_url":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2023-03-30T13:41:02+00:00","article_modified_time":"2025-09-01T15:51:48+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Coman Cosmin","Tiempo de lectura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel","datePublished":"2023-03-30T13:41:02+00:00","dateModified":"2025-09-01T15:51:48+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/"},"wordCount":3489,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/","url":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/","name":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","datePublished":"2023-03-30T13:41:02+00:00","dateModified":"2025-09-01T15:51:48+00:00","description":"Mejora la seguridad de tu app web con la autenticaci\u00f3n de Laravel. Empieza con las mejores pr\u00e1cticas de seguridad y aprende a proporcionar acceso seguro.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/03\/laravel-queue.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/autenticacion-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/es\/secciones\/laravel\/"},{"@type":"ListItem","position":3,"name":"Una Gu\u00eda Completa sobre la Autenticaci\u00f3n en Laravel"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.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:\/\/kinsta.com\/es\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","caption":"Coman Cosmin"},"description":"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.","url":"https:\/\/kinsta.com\/es\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/64480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=64480"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/64480\/revisions"}],"predecessor-version":[{"id":80057,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/64480\/revisions\/80057"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/translations\/dk"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/64480\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/64481"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=64480"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=64480"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=64480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}