lumen-seguridad-api

Aplicando seguridad en nuestra API

La seguridad es un tema primordial que debemos tener presente en todos nuestros desarrollos. En esta guía abordamos como aplicar seguridad a nuestra API.

Partimos creando nuestro proyecto

Una vez creado, vamos al archivo bootstrap/app.php y debemos descomentar lo siguiente

No obstante, para este ejemplo también debemos descomentar

Vamos al controlador app/Http/ExampleController.php y agregamos el método index

Ahora vamos a las rutas y creamos la ruta a este método, indicando que necesitamos estar autenticados

Si ahora intentamos abrir la ruta, nos retorna Unauthorized. Para entender el porqué recibimos esto, debemos ir al archivo app/Providers/AuthServiceProvider.php y buscamos el método boot.

Aquí nos damos cuenta que, para validar el usuario, está buscando en la base de datos el api_token con el que está comparando lo que se está enviando como parámetro. Entonces, vamos y creamos una migración

Y luego creamos una migración simple (a modo de ejemplo)

Finalmente corremos la migración

Ahora, para las pruebas, necesitamos usuarios, por lo que creamos un seeder

y dejamos el archivo de la siguiente manera

Agregamos el seeder a database/DatabaseSeeder.php

Y corremos la migración

Si miramos la db y agregamos el api_key en la ruta, nos daremos cuenta que ya no nos da el error, por ejemplo:

lumen-security.dev?api_token=atE3KEA6TbwLgfyhNhSrgOPs73G2EOEPkZxX4hYk

Como podemos darnos cuenta, aquí ya estamos aplicando un poco de seguridad, ya que en cada solicitud tenemos que enviar el token, no obstante ¿siempre tendrá el mismo token?, actualmente la respuesta es si, pero no es lo más conveniente. Aquí tenemos más de una forma, una de ellas es, por ejemplo, en cada login, hacer un update en el campo api_token.

Otro dato a tener en cuenta, es que si queremos cambiar la forma predeterminada en que trabaja la autenticación, vamos a app/Http/Middleware/Authenticate.php y buscamos el método handle. Si analizamos el método, encontramos que cada vez que el usuario no ha hecho login, retorna un 401.

Esto lo podemos cambiar según nuestra necesidad.

Puedes ver el ejemplo en Github

Fuente: