Autenticación HTTP básica

El sistema de autenticación HTTP básica proporciona una forma rápida de identificar a los usuarios sin necesidad de crear una página con un formulario de login. Este sistema, cuando se accede a través de la web, automáticamente mostrará una ventana emergente para solicitar los datos de acceso:

Pero es más común su utilización para proteger las rutas de una API. En este caso las credenciales se tendrían que enviar en la cabecera de la petición.

Para proteger una ruta usando el sistema de autenticación básico simplemente tenemos que añadir el filtro o middleware llamado auth.basic a la ruta o grupo de rutas, de la forma:

Route::get('profile', function () {
    // Zona de acceso restringido
})->middleware('auth.basic');

Por defecto este filtro utiliza la columna email de la tabla de usuarios para la validación.

Una vez superada la autenticación básica se crea la sesión del usuario y en cliente se almacenaría una cookie con el identificador de la sesión.

Autenticación HTTP básica sin estado

Si no queremos que la sesión se mantenga y que no se almacene una cookie tenemos que utilizar el sistema de autenticación "sin estado". Al usar este sistema se solicitará siempre el usuario y contraseña, sin almacenar las credenciales del usuario. Esta opción se suele utilizar mucho para la implementación de una API.

Laravel no incluye un Middleware por defecto para la autenticación sin estado pero lo podemos crear rápidamente. En primer lugar ejecutamos el comando de Artisan para crear un nuevo middleware:

php artisan make:middleware AuthenticateOnceWithBasicAuth

A continuación editamos la nueva clase creada para que tenga el siguiente contenido:

<?php
namespace App\Http\Middleware;

use Illuminate\Support\Facades\Auth;
use Closure;

class AuthenticateOnceWithBasicAuth
{
    public function handle($request, Closure $next)
    {
        return Auth::onceBasic() ?: $next($request);
    }
}

Básicamente lo que tenemos que añadir es el espacio de nombres use Illuminate\Support\Facades\Auth; y la línea que realiza la validación dentro de la función handle. El método onceBasic lanza la autenticación y en caso de que sea correcta permitirá continuar con la petición, y en otro caso devolverá un error de autenticación.

Por último nos faltaría registrar el middleware para poder utilizarlo. Para esto abrimos el fichero app/Http/Kernel.php y añadimos la siguiente línea al array de routeMiddleware:

'auth.basic.once' => \App\Http\Middleware\AuthenticateOnceWithBasicAuth::class,

Como se puede ver le hemos asignado el alias auth.basic.once, así que ya podemos usarlo para añadir la autenticación HTTP básica sin estado a nuestras rutas:

Route::get('api/user', function () {
    // Zona de acceso restringido
})->middleware('auth.basic.once');

Pruebas con cURL

Si intentamos acceder a una ruta protegida mediante autenticación básica utilizando los comando de cURL que hemos visto obtendremos el siguiente error:

HTTP/1.1 401 Unauthorized

Pero cURL permite también indicar el usuario y contraseña añadiendo el parámetro -u o también --user (equivalente):

$ curl --user username:password http://localhost/recurso
$ curl -u username:password http://localhost/recurso

Si solamente indicamos el usuario (y no el password) se nos solicitará al pulsar ENTER, y además al introducirlo no se verá escrito en la pantalla.

Last updated