En las últimas semanas hemos estado hablando mucho sobre las API’s. Así que esta semana voy a tratar de explicarte los diferentes métodos de autentificación (authentication) y que es la autorización (authorization), términos que pueden crear confusión.

La protección y el control de la información de tus servicios es un requisito obligatorio a la hora de hacer públicos tus servicios mediante un API o cualquier otro sistema. La seguridad no solo se determina mediante un usuario y contraseña. Se debe verificar qué funciones y permisos están establecidos en cada usuario del sistema para asegurar que el acceso al sistema es legítimo.

Para entender bien cómo gestionar la seguridad, primero entendamos qué es la autentificación y que es la autorización.

¿Que diferencia hay entre autentificación y autorización?

Es muy importante entender la diferencia entre autentificación y autorización.

Empecemos definiendo los términos:

  • autentificación (authentication): La autentificación es el proceso o acción de verificar la identidad de un usuario o proceso.
  • autorización (authorization): La autorización es una función que especifica los privilegios de acceso del usuario a los recursos de tu servicio.

La autentificación se basa en proporcionar un conjunto de credenciales para que el servidor o aplicación pueda verificar que eres quien dices ser y que la información que se proporciona es válida.

La autorización parte del proceso de autentificación y este garantiza que una vez que se determine que las credenciales de usuario son correctas, se aplicará el control de acceso para determinar a qué recursos se puede acceder en el sistema.

Evaluemos qué métodos de autentificación tenemos a nuestro alcance.

Métodos de autentificación API REST

Hay muchos métodos de seguridad y muchas formas de autentificarse, que pueden depender desde el tipo de dispositivo, el tipo de uso, la confidencialidad de la información, entre otros. No hay una sola manera de asegurar tu API. Es por ello que trataré de exponer los principales métodos para que puedas aplicar a tu proyecto la autentificación que creas conveniente.

Los 4 métodos principales de autentificación API REST son:

  1. Autentificación básica
  2. Autentificación basada en token
  3. Autentificación basada en clave API
  4. OAuth 2.0 (Autorización abierta)

Antes de entrar en detalle con los métodos, hablemos del flujo de la información.

En una API REST, enviar las credenciales una vez para iniciar sesión no es suficiente, las API REST son asíncronas. Al ser asíncrona, la API REST no puede recordar las credenciales ya que no existe ninguna sesión activa HTTP. ¡Así que tienes que indicar quién eres cada vez que hagas una petición!

Ahora si, evaluemos cada uno de los métodos:

¿Qué método de autentificación puedo implementar en mí API?

1. Autentificación básica

Esta es la forma más sencilla de asegurar tu API. Se basa principalmente en un nombre de usuario y una contraseña para identificarte.

Para comunicar estas credenciales desde el cliente hasta el servidor, se debe realizar mediante el encabezado HTTP Autorización (Authorization), según la especificación del protocolo HTTP.

Este método de autentificación está algo anticuado y puede ser un problema de seguridad en tu API REST.

¿Porque la Autentificación básica puede ser vulnerable?

Aunque el nombre de usuario o contraseña estén codificados con, por ejemplo, base64.

Cualquiera que intercepte la trasmisión de datos puede decodificar fácilmente esta información. Esto se denomina ataque Man-In-The-Middle (MiTM).

Para proteger tu API mediante la autentificación básica debes configurar que las conexiones entre los clientes y tu servicio API funcionen únicamente mediante una conexión TLS/HTTPS, nunca sobre HTTP.

2. Autentificación basada en token

En este método, el usuario se identifica al igual que con la autenticación básica, con sus credenciales, nombre de usuario y contraseña. Pero en este caso, con la primera petición de autentificación, el servidor generará un token basado en esas credenciales.

El servidor guarda en base de datos este registro y lo devuelve al usuario para que a partir de ese momento no envíe más credenciales de inicio de sesión en cada petición HTTP.  En lugar de las credenciales, simplemente se debe enviar el token codificado en cada petición HTTP.

Por norma general, los tokens están codificados con la fecha y la hora para que en caso de que alguien intercepte el token con un ataque MiTM, no pueda utilizarlo pasado un tiempo establecido. Además de que el token se puede configurar para que caduque después de un tiempo definido, por lo que los usuarios deberán iniciar sesión de nuevo.

3. Autentificación basada en clave API

A diferencia de los 2 métodos anteriores, en este caso primero debes configurar el acceso a los recursos de tu API. Tu sistema API debe generar una clave (key) y un secret key para cada cliente que requiera acceso a tus servicios. Cada vez que una aplicación necesite consumir los datos de tu API, deberás enviar tanto la key como la secret key.

Este sistema es más seguro que los métodos anteriores, pero la generación de credenciales debe ser manual y esto dificulta la escalabilidad de tu API. La automatización de generación e intercambio de key’s es una de las razones principales por las que se desarrolló el método de autentificación OAuth, que en el siguiente punto evaluaremos.

Otros problemas con la autentificación basada en clave API es la administración de claves. Con tareas tan relevantes como:

a. Genera la key y el secret key.

b. Enviar las credenciales a los desarrolladores.

c. Guardar de forma segura la key y el secret key.

Puede ser complicado poder almacenar y administrar estas credenciales. Es por ello que es imprescindible contar con una API Gateway.

4. OAuth 2.0 (Autorización abierta)

OAuth 2.0 es un método de autorización utilizado por compañías como Google, Facebook, Twitter, Amazon, Microsoft, etc. Su propósito es permitir a otros proveedores, servicios o aplicaciones, el acceso a la información sin facilitar directamente las credenciales de los usuarios. Pero tranquilo, únicamente accederán bajo la confirmación del usuario, validando la información a la que se le autorizara acceder.

Si utilizas alguno de los servicios de estas compañías, es muy probable que hayas visto un mensaje de confirmación similar al del ejemplo de Google:

Autorización de Google Calendar a BusyCal

Esta pantalla de confirmación de los servicios de Google aparece después de ser redirigido desde una aplicación externa a los servicios de Google, solicitando acceso a la cuenta de usuario de Google. En este caso, una aplicación de calendario, pero podría ser tu aplicación. Es este caso se solicita el acceso a la gestión de Google Calendar. Una vez aprobada la autorización, esta aplicación de terceros podrá acceder a la información permitida mediante una autentificación con un token de acceso.

Veamos técnicamente cómo funciona:

Protocol Flow OAuth 2 - DigitalOcean

A parte de OAuth 2.0, existe también OAuth 1.0, aunque no existe compatibilidad entre ellos. Sus especificaciones e implementaciones son completamente diferentes. La más utilizada afortunadamente es OAuth 2.0, la más actualizada y segura.

Conclusión

La protección y el control de la información de tus servicios es un requisito obligatorio a la hora de hacer públicos tus servicios mediante una API o cualquier otro sistema.

Ahora que conocemos la diferencia entre los diferentes términos como autentificación y autorización y para gestionar correctamente la seguridad, debes establecer el método de autentificación adecuado a tus necesidades.

¿Están tus servicios protegidos? ¿Qué método de autentificación utilizas en tu API REST? ¿Implementas sistemas de autorización como OAuth?

Photo by Mollie Sivaram on Unsplash