# 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:

![](/files/-LwrBLYLmo66RNXqIAz_)

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:

```php
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*:

```bash
php artisan make:middleware AuthenticateOnceWithBasicAuth
```

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

```php
<?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`:

```php
'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:

```php
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:

```bash
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):

```bash
$ 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ajgallego.gitbook.io/laravel-5/capitulo_5/capitulo_5_autenticacion_http_basica.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
