api-rest-laravel-5-1-proteccion-con-access-key

En esta lección vamos a aprender a agregar protección de acceso a nuestra API con el uso de un access key, de esta forma los «clientes» de la API deberán suministrar su clave de acceso para poder hacer uso de ella.

Hasta ahora podemos realizar una petición desde cualquier cliente sin necesidad de suministrar ningún tipo de identificación; esto podemos solucionarlo de muchas maneras, en este caso vamos a utilizar lo básico, que es crear una api key dentro del código de nuestra API que el usuario debe enviar con cada petición, luego el sistema la compara y si no coincide la petición se rechaza y se devuelve un mensaje de error al cliente.

Vamos a ingresar rápidamente a la consola y activamos tinker para crear una clave encriptada:

php artisan tinker

Posteriormente haciendo uso del facade Hash generamos una clave encriptada, en mi caso voy a utilizar el string «api-key»

Psy Shell v0.5.2 (PHP 5.6.8 — cli) by Justin Hileman
>>> \Hash::make('api-key');
=> "$2y$10$8IIyWww8.9D823nKzn4TmOmPB/VGJkeMhZ164VW.3DOHWqdcr1Fc2"

Para más información visita el post sobre Tinker, la consola de comandos de Laravel.

Perfecto, vamos a usar esta cadena como nuestra api key:

$2y$10$8IIyWww8.9D823nKzn4TmOmPB/VGJkeMhZ164VW.3DOHWqdcr1Fc2

Lo que queremos es que se solicite esta información para cada petición que realiza el usuario, por lo que tal vez lo más recomendable sea crear un middleware que se encargue de manejar esta validación:

$ php artisan make:middleware VerifyAccessKey

y editamos el archivo de la siguiente manera:

    public function handle($request, Closure $next)
    {
        // Obtenemos el api-key que el usuario envia
        $key = $request->headers->get('api_key');
        // Si coincide con el valor almacenado en la aplicacion
        // la aplicacion se sigue ejecutando
        if (isset($key) == env('API_KEY')) {
            return $next($request);
        } else {
            // Si falla devolvemos el mensaje de error
            return response()->json(['error' => 'unauthorized' ], 401);
        }
    }

De esta forma es necesario que el usuario envíe el api-key en los headers de cada petición para ser comparada con la clave que debemos tener almacenada en el archivo de configuración del proyecto (.env)

API_KEY=$2y$10$8IIyWww8.9D823nKzn4TmOmPB/VGJkeMhZ164VW.3DOHWqdcr1Fc2

Para que esto funcione debemos agregar el middleware al array $middleware dentro del archivo app/Http/Kernel.php para que se ejecute en cada petición.

\App\Http\Middleware\VerifyAccessKey::class,

Para probar podemos ingresar a la url laravel.app desde nuestro navegador y ver que obtendremos el siguiente mensaje:

{"error":"unauthorized"}

Esto se debe a que no hemos proporcionado la clave de la aplicación, para lo cual podemos hacerlo usando Postman nuevamente, hacemos click en la pestaña de «headers» e incluimos una nueva llave llamada «api-key» con el valor de nuestra clave:

laravel-postman-api-key

Como puedes ver, hemos pasado la validación del middleware y en esta ocasión obtenemos los datos del usuario.

Esta es quizás la solución más sencilla en cuanto al tema de protección de acceso, lo ideal cuando estás creando una API que va a tener más de un cliente es crear una base de datos dónde almacenes la información para cada uno de los clientes de la API, generando un api-key para cada uno de ellos, de esa forma tendrás mucho más control sobre quienes acceden.

Espero que te haya gustado esta lección, aún quedan algunos temas por abordar sobre el tema de API REST, recuerda que puedes dejar tus dudas en la sección de comentarios y no olvides compartir el contenido en redes sociales.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.