Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Autenticación

Autenticación

10.x 7 de mar. de 2026

#Introducción

Muchas aplicaciones web ofrecen a sus usuarios la posibilidad de autenticarse y "iniciar sesión". Implementar esta funcionalidad en aplicaciones web puede ser complejo y potencialmente riesgoso. Por esta razón, Laravel se esfuerza en proporcionarle las herramientas necesarias para implementar la autenticación de forma rápida, segura y sencilla.

En esencia, las facilidades de autenticación de Laravel están compuestas por "guards" y "providers". Los guards definen cómo se autentican los usuarios en cada solicitud. Por ejemplo, Laravel incluye un guard session que mantiene el estado usando almacenamiento de sesión y cookies.

Los providers definen cómo se recuperan los usuarios desde su almacenamiento persistente. Laravel soporta la recuperación de usuarios usando Eloquent y el constructor de consultas de base de datos. Sin embargo, usted puede definir providers adicionales según las necesidades de su aplicación.

El archivo de configuración de autenticación de su aplicación se encuentra en config/auth.php. Este archivo contiene varias opciones bien documentadas para ajustar el comportamiento de los servicios de autenticación de Laravel.

Примечание

No debe confundirse entre guards y providers con "roles" y "permisos". Para aprender más sobre la autorización de acciones de usuario mediante permisos, consulte la documentación de authorization.

#Kits de inicio

¿Quiere comenzar rápido? Instale un kit de inicio de aplicación Laravel en una aplicación Laravel nueva. Después de migrar su base de datos, navegue en su navegador a /register o cualquier otra URL asignada a su aplicación. ¡Los kits de inicio se encargarán de generar todo el sistema de autenticación!

Incluso si decide no usar un kit de inicio en su aplicación Laravel final, instalar el kit de inicio Laravel Breeze puede ser una excelente oportunidad para aprender cómo implementar toda la funcionalidad de autenticación de Laravel en un proyecto real. Laravel Breeze crea controladores, rutas y vistas de autenticación para usted, por lo que puede examinar el código en estos archivos para entender cómo se implementan las características de autenticación de Laravel.

#Consideraciones sobre la base de datos

Por defecto, Laravel incluye un modelo Eloquent App\Models\User en su directorio app/Models. Este modelo puede usarse con el driver de autenticación Eloquent por defecto. Si su aplicación no usa Eloquent, puede usar el provider de autenticación database que utiliza el constructor de consultas de Laravel.

Al construir el esquema de base de datos para el modelo App\Models\User, asegúrese de que la columna de contraseña tenga al menos 60 caracteres de longitud. Por supuesto, la migración de la tabla users incluida en las nuevas aplicaciones Laravel ya crea una columna que supera esta longitud.

Además, debe verificar que su tabla users (o equivalente) contenga una columna remember_token de tipo string, nullable y con 100 caracteres. Esta columna se usará para almacenar un token para los usuarios que seleccionen la opción "recordarme" al iniciar sesión. Nuevamente, la migración por defecto de la tabla users incluida en nuevas aplicaciones Laravel ya contiene esta columna.

#Descripción general del ecosistema

Laravel ofrece varios paquetes relacionados con la autenticación. Antes de continuar, revisaremos el ecosistema general de autenticación en Laravel y discutiremos el propósito de cada paquete.

Primero, considere cómo funciona la autenticación. Cuando se usa un navegador web, un usuario proporciona su nombre de usuario y contraseña a través de un formulario de inicio de sesión. Si estas credenciales son correctas, la aplicación almacenará información sobre el usuario autenticado en la sesión del usuario. Una cookie emitida al navegador contiene el ID de sesión para que las solicitudes posteriores puedan asociar al usuario con la sesión correcta. Tras recibir la cookie de sesión, la aplicación recupera los datos de sesión basándose en el ID de sesión, nota que la información de autenticación está almacenada en la sesión y considera al usuario como "autenticado".

Cuando un servicio remoto necesita autenticarse para acceder a una API, normalmente no se usan cookies para la autenticación porque no hay navegador web. En su lugar, el servicio remoto envía un token API en cada solicitud. La aplicación puede validar el token recibido contra una tabla de tokens API válidos y "autenticar" la solicitud como realizada por el usuario asociado a ese token API.

#Servicios de autenticación integrados para navegador de Laravel

Laravel incluye servicios integrados de autenticación y sesión que normalmente se acceden mediante las fachadas Auth y Session. Estas características proporcionan autenticación basada en cookies para solicitudes iniciadas desde navegadores web. Ofrecen métodos que permiten verificar las credenciales de un usuario y autenticarlo. Además, estos servicios almacenan automáticamente los datos de autenticación adecuados en la sesión del usuario y emiten la cookie de sesión del usuario. Esta documentación contiene una explicación de cómo usar estos servicios.

Kits de inicio de aplicación

Como se explica en esta documentación, puede interactuar manualmente con estos servicios de autenticación para construir su propia capa de autenticación en la aplicación. Sin embargo, para ayudarle a comenzar más rápido, hemos lanzado paquetes gratuitos que proporcionan un andamiaje robusto y moderno de toda la capa de autenticación. Estos paquetes son Laravel Breeze, Laravel Jetstream y Laravel Fortify.

Laravel Breeze es una implementación simple y minimalista de todas las características de autenticación de Laravel, incluyendo inicio de sesión, registro, restablecimiento de contraseña, verificación de correo electrónico y confirmación de contraseña. La capa de vistas de Laravel Breeze está compuesta por simples plantillas Blade estilizadas con Tailwind CSS. Para comenzar, consulte la documentación sobre los kits de inicio de aplicación de Laravel.

Laravel Fortify es un backend de autenticación sin interfaz para Laravel que implementa muchas de las características descritas en esta documentación, incluyendo autenticación basada en cookies y otras funciones como autenticación de dos factores y verificación de correo electrónico. Fortify proporciona el backend de autenticación para Laravel Jetstream o puede usarse de forma independiente junto con Laravel Sanctum para ofrecer autenticación a una SPA que necesita autenticarse con Laravel.

Laravel Jetstream es un kit de inicio de aplicación robusto que consume y expone los servicios de autenticación de Laravel Fortify con una interfaz moderna y atractiva impulsada por Tailwind CSS, Livewire y/o Inertia. Laravel Jetstream incluye soporte opcional para autenticación de dos factores, soporte para equipos, gestión de sesiones de navegador, gestión de perfil e integración incorporada con Laravel Sanctum para ofrecer autenticación con tokens API. Las opciones de autenticación API de Laravel se discuten a continuación.

#Servicios de autenticación API de Laravel

Laravel ofrece dos paquetes opcionales para ayudarle a gestionar tokens API y autenticar solicitudes realizadas con tokens API: Passport y Sanctum. Tenga en cuenta que estas librerías y los servicios de autenticación integrados basados en cookies de Laravel no son mutuamente excluyentes. Estas librerías se enfocan principalmente en la autenticación con tokens API, mientras que los servicios integrados se enfocan en la autenticación basada en cookies para navegadores. Muchas aplicaciones usan tanto los servicios integrados de autenticación basados en cookies de Laravel como uno de los paquetes de autenticación API de Laravel.

Passport

Passport es un proveedor de autenticación OAuth2 que ofrece varios "tipos de concesión" OAuth2 que permiten emitir distintos tipos de tokens. En general, es un paquete robusto y complejo para autenticación API. Sin embargo, la mayoría de las aplicaciones no requieren las características complejas que ofrece la especificación OAuth2, lo que puede resultar confuso para usuarios y desarrolladores. Además, históricamente los desarrolladores se han confundido sobre cómo autenticar aplicaciones SPA o móviles usando proveedores OAuth2 como Passport.

Sanctum

En respuesta a la complejidad de OAuth2 y la confusión de los desarrolladores, creamos un paquete de autenticación más simple y directo que puede manejar tanto solicitudes web de primera parte desde un navegador como solicitudes API mediante tokens. Este objetivo se logró con el lanzamiento de Laravel Sanctum, que debe considerarse el paquete de autenticación preferido y recomendado para aplicaciones que ofrecen una interfaz web de primera parte además de una API, o que están impulsadas por una SPA que existe separadamente del backend Laravel, o aplicaciones que ofrecen un cliente móvil.

Laravel Sanctum es un paquete híbrido de autenticación web/API que puede gestionar todo el proceso de autenticación de su aplicación. Esto es posible porque cuando una aplicación basada en Sanctum recibe una solicitud, Sanctum primero determina si la solicitud incluye una cookie de sesión que referencia una sesión autenticada. Sanctum logra esto llamando a los servicios de autenticación integrados de Laravel que discutimos anteriormente. Si la solicitud no se autentica mediante una cookie de sesión, Sanctum inspecciona la solicitud en busca de un token API. Si hay un token API presente, Sanctum autentica la solicitud usando ese token. Para aprender más sobre este proceso, consulte la documentación de Sanctum "cómo funciona".

Laravel Sanctum es el paquete API que hemos elegido incluir con el kit de inicio de aplicación Laravel Jetstream porque creemos que es la mejor opción para la mayoría de las necesidades de autenticación de aplicaciones web.

#Resumen y elección de su stack

En resumen, si su aplicación será accedida mediante un navegador y está construyendo una aplicación Laravel monolítica, su aplicación usará los servicios de autenticación integrados de Laravel.

Luego, si su aplicación ofrece una API que será consumida por terceros, deberá elegir entre Passport o Sanctum para proporcionar autenticación con tokens API. En general, se debe preferir Sanctum cuando sea posible, ya que es una solución simple y completa para autenticación API, autenticación SPA y autenticación móvil, incluyendo soporte para "scopes" o "abilities".

Si está construyendo una aplicación de una sola página (SPA) que será impulsada por un backend Laravel, debe usar Laravel Sanctum. Al usar Sanctum, necesitará implementar manualmente sus propias rutas de autenticación backend o utilizar Laravel Fortify como un backend de autenticación sin interfaz que proporciona rutas y controladores para funciones como registro, restablecimiento de contraseña, verificación de correo electrónico y más.

Passport puede ser elegido cuando su aplicación necesite absolutamente todas las características proporcionadas por la especificación OAuth2.

Y, si desea comenzar rápidamente, le recomendamos Laravel Breeze como una forma rápida de iniciar una nueva aplicación Laravel que ya use nuestro stack de autenticación preferido: los servicios de autenticación integrados de Laravel y Laravel Sanctum.

#Primeros pasos con la autenticación

Внимание

Esta parte de la documentación trata sobre la autenticación de usuarios mediante los kits de inicio de aplicación Laravel, que incluyen andamiaje de interfaz para ayudarle a comenzar rápidamente. Si desea integrarse directamente con los sistemas de autenticación de Laravel, consulte la documentación sobre autenticación manual de usuarios.

#Instalar un kit de inicio

Primero, debe instalar un kit de inicio de aplicación Laravel. Nuestros kits de inicio actuales, Laravel Breeze y Laravel Jetstream, ofrecen puntos de partida bellamente diseñados para incorporar autenticación en su aplicación Laravel nueva.

Laravel Breeze es una implementación mínima y simple de todas las características de autenticación de Laravel, incluyendo inicio de sesión, registro, restablecimiento de contraseña, verificación de correo electrónico y confirmación de contraseña. La capa de vistas de Laravel Breeze está compuesta por simples plantillas Blade estilizadas con Tailwind CSS. Además, Breeze ofrece opciones de andamiaje basadas en Livewire o Inertia, con la opción de usar Vue o React para el andamiaje basado en Inertia.

Laravel Jetstream es un kit de inicio de aplicación más robusto que incluye soporte para andamiaje con Livewire o Inertia y Vue. Además, Jetstream ofrece soporte opcional para autenticación de dos factores, equipos, gestión de perfil, gestión de sesiones de navegador, soporte API mediante Laravel Sanctum, eliminación de cuenta y más.

#Obtener el usuario autenticado

Después de instalar un kit de inicio de autenticación y permitir que los usuarios se registren y autentiquen con su aplicación, a menudo necesitará interactuar con el usuario actualmente autenticado. Al manejar una solicitud entrante, puede acceder al usuario autenticado mediante el método user de la fachada Auth:

use Illuminate\Support\Facades\Auth;

// Obtener el usuario actualmente autenticado...
$user = Auth::user();

// Obtener el ID del usuario actualmente autenticado...
$id = Auth::id();

Alternativamente, una vez que un usuario está autenticado, puede acceder al usuario autenticado mediante una instancia de Illuminate\Http\Request. Recuerde que las clases tipeadas se inyectan automáticamente en los métodos de su controlador. Al tipar el objeto Illuminate\Http\Request, puede acceder cómodamente al usuario autenticado desde cualquier método del controlador mediante el método user de la solicitud:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class FlightController extends Controller
{
    /**
     * Actualizar la información de un vuelo existente.
     */
    public function update(Request $request): RedirectResponse
    {
        $user = $request->user();

        // ...

        return redirect('/flights');
    }
}

#Determinar si el usuario actual está autenticado

Para determinar si el usuario que realiza la solicitud HTTP entrante está autenticado, puede usar el método check de la fachada Auth. Este método devolverá true si el usuario está autenticado:

use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // El usuario ha iniciado sesión...
}
Примечание

Aunque es posible determinar si un usuario está autenticado usando el método check, normalmente usará un middleware para verificar que el usuario esté autenticado antes de permitirle acceder a ciertas rutas o controladores. Para aprender más sobre esto, consulte la documentación sobre protección de rutas.

#Protección de rutas

El middleware de rutas puede usarse para permitir que solo usuarios autenticados accedan a una ruta dada. Laravel incluye un middleware auth, que referencia la clase Illuminate\Auth\Middleware\Authenticate. Como este middleware ya está registrado en el kernel HTTP de su aplicación, solo necesita adjuntarlo a la definición de una ruta:

Route::get('/flights', function () {
    // Solo usuarios autenticados pueden acceder a esta ruta...
})->middleware('auth');

#Redirigir usuarios no autenticados

Cuando el middleware auth detecta un usuario no autenticado, redirige al usuario a la ruta nombrada login named route. Puede modificar este comportamiento actualizando la función redirectTo en el archivo app/Http/Middleware/Authenticate.php de su aplicación:

use Illuminate\Http\Request;

/**
 * Obtener la ruta a la que se debe redirigir al usuario.
 */
protected function redirectTo(Request $request): string
{
    return route('login');
}

#Especificar un guard

Al adjuntar el middleware auth a una ruta, también puede especificar qué "guard" debe usarse para autenticar al usuario. El guard especificado debe corresponder a una de las claves en el arreglo guards de su archivo de configuración auth.php:

Route::get('/flights', function () {
    // Solo usuarios autenticados pueden acceder a esta ruta...
})->middleware('auth:admin');

#Limitación de intentos de inicio de sesión

Si está usando los kits de inicio Laravel Breeze o Laravel Jetstream, se aplicará automáticamente limitación de tasa a los intentos de inicio de sesión. Por defecto, el usuario no podrá iniciar sesión durante un minuto si falla en proporcionar las credenciales correctas tras varios intentos. La limitación es única para el nombre de usuario / correo electrónico del usuario y su dirección IP.

Примечание

Si desea limitar la tasa en otras rutas de su aplicación, consulte la documentación sobre limitación de tasa.

#Autenticación manual de usuarios

No está obligado a usar el andamiaje de autenticación incluido con los kits de inicio de aplicación Laravel. Si decide no usar este andamiaje, deberá gestionar la autenticación de usuarios usando las clases de autenticación de Laravel directamente. ¡No se preocupe, es muy sencillo!

Accederemos a los servicios de autenticación de Laravel mediante la fachada Auth facade, por lo que debemos importar la fachada Auth al inicio de la clase. A continuación, veamos el método attempt. El método attempt se usa normalmente para manejar intentos de autenticación desde el formulario de "login" de su aplicación. Si la autenticación es exitosa, debe regenerar la sesión del usuario para prevenir fijación de sesión:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    /**
     * Manejar un intento de autenticación.
     */
    public function authenticate(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        if (Auth::attempt($credentials)) {
            $request->session()->regenerate();

            return redirect()->intended('dashboard');
        }

        return back()->withErrors([
            'email' => 'Las credenciales proporcionadas no coinciden con nuestros registros.',
        ])->onlyInput('email');
    }
}

El método attempt acepta un arreglo de pares clave / valor como primer argumento. Los valores en el arreglo se usarán para encontrar al usuario en su tabla de base de datos. Así, en el ejemplo anterior, el usuario se recuperará por el valor de la columna email. Si el usuario es encontrado, la contraseña hasheada almacenada en la base de datos se comparará con el valor password pasado al método mediante el arreglo. No debe hashear el valor password recibido en la solicitud, ya que el framework lo hará automáticamente antes de compararlo con la contraseña hasheada en la base de datos. Se iniciará una sesión autenticada para el usuario si las dos contraseñas hasheadas coinciden.

Recuerde que los servicios de autenticación de Laravel recuperan usuarios de su base de datos basándose en la configuración del "provider" de su guard de autenticación. En el archivo de configuración por defecto config/auth.php, se especifica el provider de usuario Eloquent y se indica usar el modelo App\Models\User para recuperar usuarios. Puede cambiar estos valores en su archivo de configuración según las necesidades de su aplicación.

El método attempt devolverá true si la autenticación fue exitosa. De lo contrario, devolverá false.

El método intended proporcionado por el redireccionador de Laravel redirigirá al usuario a la URL que intentaba acceder antes de ser interceptado por el middleware de autenticación. Se puede proporcionar una URI de respaldo a este método en caso de que el destino previsto no esté disponible.

#Especificar condiciones adicionales

Si lo desea, también puede agregar condiciones adicionales a la consulta de autenticación además del correo electrónico y la contraseña del usuario. Para lograr esto, simplemente agregamos las condiciones a la matriz pasada al método attempt. Por ejemplo, podemos verificar que el usuario esté marcado como "activo":

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // La autenticación fue exitosa...
}

Para condiciones de consulta más complejas, puede proporcionar un closure en su arreglo de credenciales. Este closure será invocado con la instancia de consulta, permitiéndole personalizar la consulta según las necesidades de su aplicación:

use Illuminate\Database\Eloquent\Builder;

if (Auth::attempt([
    'email' => $email,
    'password' => $password,
    fn (Builder $query) => $query->has('activeSubscription'),
])) {
    // La autenticación fue exitosa...
}
Внимание

En estos ejemplos, email no es una opción obligatoria, solo se usa como ejemplo. Debe usar el nombre de columna que corresponda a un "nombre de usuario" en su tabla de base de datos.

El método attemptWhen, que recibe un closure como segundo argumento, puede usarse para realizar una inspección más extensa del usuario potencial antes de autenticarlo realmente. El closure recibe al usuario potencial y debe devolver true o false para indicar si el usuario puede ser autenticado:

if (Auth::attemptWhen([
    'email' => $email,
    'password' => $password,
], function (User $user) {
    return $user->isNotBanned();
})) {
    // La autenticación fue exitosa...
}

#Acceder a instancias específicas de guard

A través del método guard del facade Auth, puede especificar qué instancia de guardia desea utilizar al autenticar al usuario. Esto le permite gestionar la autenticación para diferentes partes de su aplicación usando modelos autenticables o tablas de usuarios completamente separadas.

El nombre de la guardia pasado al método guard debe corresponder a una de las guardias configuradas en su archivo de configuración auth.php:

if (Auth::guard('admin')->attempt($credentials)) {
    // ...
}

#Recordando a los usuarios

Muchas aplicaciones web ofrecen una casilla de verificación "recordarme" en su formulario de inicio de sesión. Si desea proporcionar esta funcionalidad en su aplicación, puede pasar un valor booleano como segundo argumento al método attempt.

Cuando este valor es true, Laravel mantendrá al usuario autenticado indefinidamente o hasta que cierre sesión manualmente. Su tabla users debe incluir la columna de tipo string remember_token, que se usará para almacenar el token de "recordarme". La migración de la tabla users incluida en las nuevas aplicaciones Laravel ya incluye esta columna:

use Illuminate\Support\Facades\Auth;

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // El usuario está siendo recordado...
}

Si su aplicación ofrece la funcionalidad "recordarme", puede usar el método viaRemember para determinar si el usuario actualmente autenticado fue autenticado usando la cookie de "recordarme":

use Illuminate\Support\Facades\Auth;

if (Auth::viaRemember()) {
    // ...
}

#Otros métodos de autenticación

#Autenticar una instancia de usuario

Si necesita establecer una instancia de usuario existente como el usuario actualmente autenticado, puede pasar la instancia de usuario al método login del facade Auth. La instancia de usuario dada debe ser una implementación del contrato Illuminate\Contracts\Auth\Authenticatable. El modelo App\Models\User incluido con Laravel ya implementa esta interfaz. Este método de autenticación es útil cuando ya tiene una instancia de usuario válida, como justo después de que un usuario se registre en su aplicación:

use Illuminate\Support\Facades\Auth;

Auth::login($user);

Puede pasar un valor booleano como segundo argumento al método login. Este valor indica si se desea la funcionalidad "recordarme" para la sesión autenticada. Recuerde, esto significa que la sesión permanecerá autenticada indefinidamente o hasta que el usuario cierre sesión manualmente:

Auth::login($user, $remember = true);

Si es necesario, puede especificar una guardia de autenticación antes de llamar al método login:

Auth::guard('admin')->login($user);

#Autenticar un usuario por ID

Para autenticar a un usuario usando la clave primaria de su registro en la base de datos, puede usar el método loginUsingId. Este método acepta la clave primaria del usuario que desea autenticar:

Auth::loginUsingId(1);

Puede pasar un valor booleano como segundo argumento al método loginUsingId. Este valor indica si se desea la funcionalidad "recordarme" para la sesión autenticada. Recuerde, esto significa que la sesión permanecerá autenticada indefinidamente o hasta que el usuario cierre sesión manualmente:

Auth::loginUsingId(1, $remember = true);

#Autenticar a un usuario una sola vez

Puede usar el método once para autenticar a un usuario con la aplicación solo para una única solicitud. No se utilizarán sesiones ni cookies al llamar a este método:

if (Auth::once($credentials)) {
    // ...
}

#Autenticación HTTP Basic

La autenticación HTTP Basic proporciona una forma rápida de autenticar a los usuarios de su aplicación sin configurar una página de "login" dedicada. Para comenzar, adjunte el middleware auth.basic a una ruta. El middleware auth.basic está incluido en el framework Laravel, por lo que no necesita definirlo:

Route::get('/profile', function () {
    // Solo los usuarios autenticados pueden acceder a esta ruta...
})->middleware('auth.basic');

Una vez que el middleware se haya adjuntado a la ruta, se le solicitarán automáticamente las credenciales al acceder a la ruta en su navegador. Por defecto, el middleware auth.basic asumirá que la columna email en su tabla users es el "nombre de usuario" del usuario.

#Nota sobre FastCGI

Si está usando PHP FastCGI y Apache para servir su aplicación Laravel, la autenticación HTTP Basic puede no funcionar correctamente. Para corregir estos problemas, puede agregar las siguientes líneas al archivo .htaccess de su aplicación:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

#Autenticación HTTP Basic sin estado

También puede usar la autenticación HTTP Basic sin establecer una cookie de identificación de usuario en la sesión. Esto es especialmente útil si decide usar la autenticación HTTP para autenticar solicitudes a la API de su aplicación. Para lograr esto, defina un middleware que llame al método onceBasic. Si el método onceBasic no devuelve una respuesta, la solicitud puede continuar hacia la aplicación:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class AuthenticateOnceWithBasicAuth
{
    /**
     * Manejar una solicitud entrante.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        return Auth::onceBasic() ?: $next($request);
    }

}

Luego, adjunte el middleware a una ruta:

Route::get('/api/user', function () {
    // Solo los usuarios autenticados pueden acceder a esta ruta...
})->middleware(AuthenticateOnceWithBasicAuth::class);

#Cerrar sesión

Para cerrar sesión manualmente a los usuarios de su aplicación, puede usar el método logout proporcionado por el facade Auth. Esto eliminará la información de autenticación de la sesión del usuario para que las solicitudes posteriores no estén autenticadas.

Además de llamar al método logout, se recomienda invalidar la sesión del usuario y regenerar su token CSRF. Después de cerrar sesión, normalmente redirigirá al usuario a la raíz de su aplicación:

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;

/**
 * Cerrar la sesión del usuario en la aplicación.
 */
public function logout(Request $request): RedirectResponse
{
    Auth::logout();

    $request->session()->invalidate();

    $request->session()->regenerateToken();

    return redirect('/');
}

#Invalidar sesiones en otros dispositivos

Laravel también proporciona un mecanismo para invalidar y "cerrar sesión" en las sesiones activas de un usuario en otros dispositivos sin invalidar la sesión en su dispositivo actual. Esta función se utiliza típicamente cuando un usuario cambia o actualiza su contraseña y desea invalidar las sesiones en otros dispositivos mientras mantiene autenticado el dispositivo actual.

Antes de comenzar, debe asegurarse de que el middleware Illuminate\Session\Middleware\AuthenticateSession esté incluido en las rutas que deben recibir autenticación de sesión. Normalmente, debe colocar este middleware en una definición de grupo de rutas para que se aplique a la mayoría de las rutas de su aplicación. Por defecto, el middleware AuthenticateSession puede adjuntarse a una ruta usando el alias de middleware de ruta auth.session definido en el kernel HTTP de su aplicación:

Route::middleware(['auth', 'auth.session'])->group(function () {
    Route::get('/', function () {
        // ...
    });
});

Luego, puede usar el método logoutOtherDevices proporcionado por el facade Auth. Este método requiere que el usuario confirme su contraseña actual, la cual su aplicación debe aceptar a través de un formulario de entrada:

use Illuminate\Support\Facades\Auth;

Auth::logoutOtherDevices($currentPassword);

Cuando se invoca el método logoutOtherDevices, las otras sesiones del usuario serán invalidadas completamente, lo que significa que se cerrará sesión en todas las guardias en las que estaba autenticado previamente.

#Confirmación de contraseña

Mientras construye su aplicación, puede haber acciones que requieran que el usuario confirme su contraseña antes de que se realice la acción o antes de que el usuario sea redirigido a una zona sensible de la aplicación. Laravel incluye middleware incorporado para facilitar este proceso. Implementar esta función requerirá definir dos rutas: una para mostrar una vista que solicite al usuario confirmar su contraseña y otra para confirmar que la contraseña es válida y redirigir al usuario a su destino previsto.

Примечание

La siguiente documentación explica cómo integrar directamente las funciones de confirmación de contraseña de Laravel; sin embargo, si desea comenzar más rápido, los starter kits de Laravel incluyen soporte para esta función.

#Configuración

Después de confirmar su contraseña, a un usuario no se le pedirá que confirme su contraseña nuevamente durante tres horas. Sin embargo, puede configurar el tiempo antes de que se le vuelva a solicitar la contraseña cambiando el valor de configuración password_timeout en el archivo config/auth.php de su aplicación.

#Rutas

#El formulario de confirmación de contraseña

Primero, definiremos una ruta para mostrar una vista que solicite al usuario confirmar su contraseña:

Route::get('/confirm-password', function () {
    return view('auth.confirm-password');
})->middleware('auth')->name('password.confirm');

Como puede esperar, la vista que devuelve esta ruta debe tener un formulario que contenga un campo password. Además, siéntase libre de incluir texto en la vista que explique que el usuario está entrando en un área protegida de la aplicación y debe confirmar su contraseña.

#Confirmando la contraseña

Luego, definiremos una ruta que manejará la solicitud del formulario de la vista "confirmar contraseña". Esta ruta será responsable de validar la contraseña y redirigir al usuario a su destino previsto:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Redirect;

Route::post('/confirm-password', function (Request $request) {
    if (! Hash::check($request->password, $request->user()->password)) {
        return back()->withErrors([
            'password' => ['La contraseña proporcionada no coincide con nuestros registros.']
        ]);
    }

    $request->session()->passwordConfirmed();

    return redirect()->intended();
})->middleware(['auth', 'throttle:6,1']);

Antes de continuar, examinemos esta ruta con más detalle. Primero, se verifica que el campo password de la solicitud coincida realmente con la contraseña del usuario autenticado. Si la contraseña es válida, debemos informar a la sesión de Laravel que el usuario ha confirmado su contraseña. El método passwordConfirmed establecerá una marca de tiempo en la sesión del usuario que Laravel puede usar para determinar cuándo fue la última vez que el usuario confirmó su contraseña. Finalmente, podemos redirigir al usuario a su destino previsto.

#Protegiendo rutas

Debe asegurarse de que cualquier ruta que realice una acción que requiera una confirmación reciente de contraseña tenga asignado el middleware password.confirm. Este middleware está incluido en la instalación predeterminada de Laravel y almacenará automáticamente el destino previsto del usuario en la sesión para que pueda ser redirigido a esa ubicación después de confirmar su contraseña. Después de almacenar el destino previsto en la sesión, el middleware redirigirá al usuario a la ruta nombrada password.confirm named route:

Route::get('/settings', function () {
    // ...
})->middleware(['password.confirm']);

Route::post('/settings', function () {
    // ...
})->middleware(['password.confirm']);

#Añadiendo guardias personalizados

Puede definir sus propios guardias de autenticación usando el método extend del facade Auth. Debe colocar su llamada al método extend dentro de un service provider. Como Laravel ya incluye un AuthServiceProvider, podemos colocar el código en ese proveedor:

<?php

namespace App\Providers;

use App\Services\Auth\JwtGuard;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Registrar cualquier servicio de autenticación/autorización de la aplicación.
     */
    public function boot(): void
    {
        Auth::extend('jwt', function (Application $app, string $name, array $config) {
            // Retornar una instancia de Illuminate\Contracts\Auth\Guard...

            return new JwtGuard(Auth::createUserProvider($config['provider']));
        });
    }
}

Como puede ver en el ejemplo anterior, el callback pasado al método extend debe retornar una implementación de Illuminate\Contracts\Auth\Guard. Esta interfaz contiene algunos métodos que deberá implementar para definir un guardia personalizado. Una vez que su guardia personalizado esté definido, puede referenciarlo en la configuración guards de su archivo auth.php:

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

#Guardias de solicitud con Closure

La forma más sencilla de implementar un sistema de autenticación personalizado basado en solicitudes HTTP es usando el método Auth::viaRequest. Este método le permite definir rápidamente su proceso de autenticación usando un solo closure.

Para comenzar, llame al método Auth::viaRequest dentro del método boot de su AuthServiceProvider. El método viaRequest acepta un nombre de driver de autenticación como primer argumento. Este nombre puede ser cualquier cadena que describa su guardia personalizado. El segundo argumento pasado al método debe ser un closure que reciba la solicitud HTTP entrante y retorne una instancia de usuario o, si la autenticación falla, null:

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

/**
 * Registrar cualquier servicio de autenticación/autorización de la aplicación.
 */
public function boot(): void
{
    Auth::viaRequest('custom-token', function (Request $request) {
        return User::where('token', (string) $request->token)->first();
    });
}

Una vez que su driver de autenticación personalizado esté definido, puede configurarlo como un driver dentro de la configuración guards de su archivo auth.php:

'guards' => [
    'api' => [
        'driver' => 'custom-token',
    ],
],

Finalmente, puede referenciar el guardia al asignar el middleware de autenticación a una ruta:

Route::middleware('auth:api')->group(function () {
    // ...
});

#Añadiendo proveedores de usuario personalizados

Si no está usando una base de datos relacional tradicional para almacenar sus usuarios, necesitará extender Laravel con su propio proveedor de usuarios para autenticación. Usaremos el método provider del facade Auth para definir un proveedor de usuario personalizado. El resolvedor del proveedor de usuario debe retornar una implementación de Illuminate\Contracts\Auth\UserProvider:

<?php

namespace App\Providers;

use App\Extensions\MongoUserProvider;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Auth;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Registrar cualquier servicio de autenticación/autorización de la aplicación.
     */
    public function boot(): void
    {
        Auth::provider('mongo', function (Application $app, array $config) {
            // Retornar una instancia de Illuminate\Contracts\Auth\UserProvider...

            return new MongoUserProvider($app->make('mongo.connection'));
        });
    }
}

Después de registrar el proveedor usando el método provider, puede cambiar al nuevo proveedor de usuario en su archivo de configuración auth.php. Primero, defina un provider que use su nuevo driver:

'providers' => [
    'users' => [
        'driver' => 'mongo',
    ],
],

Finalmente, puede referenciar este proveedor en su configuración guards:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

#El contrato User Provider

Las implementaciones de Illuminate\Contracts\Auth\UserProvider son responsables de obtener una implementación de Illuminate\Contracts\Auth\Authenticatable desde un sistema de almacenamiento persistente, como MySQL, MongoDB, etc. Estas dos interfaces permiten que los mecanismos de autenticación de Laravel sigan funcionando independientemente de cómo se almacenen los datos del usuario o qué tipo de clase se use para representar al usuario autenticado:

Veamos el contrato Illuminate\Contracts\Auth\UserProvider:

<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider
{
    public function retrieveById($identifier);
    public function retrieveByToken($identifier, $token);
    public function updateRememberToken(Authenticatable $user, $token);
    public function retrieveByCredentials(array $credentials);
    public function validateCredentials(Authenticatable $user, array $credentials);
}

La función retrieveById típicamente recibe una clave que representa al usuario, como un ID autoincremental de una base de datos MySQL. La implementación de Authenticatable que coincida con el ID debe ser recuperada y retornada por el método.

La función retrieveByToken recupera un usuario por su $identifier único y el token de "recordarme" $token, típicamente almacenado en una columna de base de datos como remember_token. Al igual que con el método anterior, la implementación de Authenticatable con un valor de token coincidente debe ser retornada por este método.

El método updateRememberToken actualiza el remember_token de la instancia $user con el nuevo $token. Se asigna un token nuevo a los usuarios en un intento exitoso de autenticación "recordarme" o cuando el usuario cierra sesión.

El método retrieveByCredentials recibe el arreglo de credenciales pasado al método Auth::attempt al intentar autenticarse con una aplicación. El método debe "consultar" el almacenamiento persistente subyacente para el usuario que coincida con esas credenciales. Típicamente, este método ejecutará una consulta con una condición "where" que busque un registro de usuario con un "nombre de usuario" que coincida con el valor de $credentials['username']. El método debe retornar una implementación de Authenticatable. Este método no debe intentar validar la contraseña ni autenticar.

El método validateCredentials debe comparar el $user dado con las $credentials para autenticar al usuario. Por ejemplo, este método típicamente usará el método Hash::check para comparar el valor de $user->getAuthPassword() con el valor de $credentials['password']. Este método debe retornar true o false indicando si la contraseña es válida.

#El contrato Authenticatable

Ahora que hemos explorado cada uno de los métodos en UserProvider, veamos el contrato Authenticatable. Recuerde, los proveedores de usuario deben retornar implementaciones de esta interfaz desde los métodos retrieveById, retrieveByToken y retrieveByCredentials:

<?php

namespace Illuminate\Contracts\Auth;

interface Authenticatable
{
    public function getAuthIdentifierName();
    public function getAuthIdentifier();
    public function getAuthPassword();
    public function getRememberToken();
    public function setRememberToken($value);
    public function getRememberTokenName();
}

Esta interfaz es sencilla. El método getAuthIdentifierName debe retornar el nombre del campo de "clave primaria" del usuario y el método getAuthIdentifier debe retornar la "clave primaria" del usuario. Cuando se usa un backend MySQL, esto probablemente será la clave primaria autoincremental asignada al registro del usuario. El método getAuthPassword debe retornar la contraseña hasheada del usuario.

Esta interfaz permite que el sistema de autenticación funcione con cualquier clase "usuario", independientemente del ORM o capa de abstracción de almacenamiento que esté usando. Por defecto, Laravel incluye una clase App\Models\User en el directorio app/Models que implementa esta interfaz.

#Eventos

Laravel despacha una variedad de eventos durante el proceso de autenticación. Puede adjuntar listeners a estos eventos en su EventServiceProvider:

/**
 * Las asignaciones de listeners de eventos para la aplicación.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Registered' => [
        'App\Listeners\LogRegisteredUser',
    ],

    'Illuminate\Auth\Events\Attempting' => [
        'App\Listeners\LogAuthenticationAttempt',
    ],

    'Illuminate\Auth\Events\Authenticated' => [
        'App\Listeners\LogAuthenticated',
    ],

    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\LogSuccessfulLogin',
    ],

    'Illuminate\Auth\Events\Failed' => [
        'App\Listeners\LogFailedLogin',
    ],

    'Illuminate\Auth\Events\Validated' => [
        'App\Listeners\LogValidated',
    ],

    'Illuminate\Auth\Events\Verified' => [
        'App\Listeners\LogVerified',
    ],

    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\LogSuccessfulLogout',
    ],

    'Illuminate\Auth\Events\CurrentDeviceLogout' => [
        'App\Listeners\LogCurrentDeviceLogout',
    ],

    'Illuminate\Auth\Events\OtherDeviceLogout' => [
        'App\Listeners\LogOtherDeviceLogout',
    ],

    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],

    'Illuminate\Auth\Events\PasswordReset' => [
        'App\Listeners\LogPasswordReset',
    ],
];