API REST y su autenticación basada en token
Ante la imparable evolución de aplicaciones, frameworks, lenguajes y alternativas para facilitarnos las tareas de Desarrollo Web en diferentes ámbitos, hablaremos en el artículo de hoy sobre el modelo de autenticación para API REST basado en token. Las API REST, son una de las mejores maneras de proyectar un backend y además, son uno de los mejores recursos actuales para cualquier desarrollador y en esta ocasión, queremos que conozcas mejor las características y el flujo de este modelo. En el mundo de las API REST, se deben implementar flujos distintos de los habituales en cuanto a la autenticación de usuarios, ya que su arquitectura nos ofrece otro tipo de recursos que los tradicionales. Por lo general, en las aplicaciones web tradicionales, se utilizan las variables de sesión como soporte para memorizar el usuario. Esto viene a decir que en el momento de autenticar un usuario, el servidor dedicado genera las correspondientes variables de sesión y en las siguientes páginas consultadas por ese mismo cliente, es capaz de recordar al usuario. [banneroferta product=2] Sin embargo, en las aplicaciones REST, esto no es posible, ya que una de las limitaciones de este sistema es que no se dispone de variables de sesión. Esto es debido a motivos de escalabilidad, ya que las API REST suelen estar alojadas en un cluster de servidores. La solución habitual para salvar este problema es la autenticación por token, algo que vamos a explicar conceptualmente en este artículo.
Flujo de autenticación por usuario y contraseña
El hecho de usar un token como mecanismo involucrado en la autenticación no produce efectos visibles para los usuarios, ya que estos no tienen que lidiar con él directamente. Dicho de otra manera, todas las diferencias en el flujo son transparentes para el usuario.
Por lo tanto, desde el punto de vista del usuario, para la autenticación se deberá seguir aportando el par usuario/clave habitual de cualquier otro sistema.
Recepción del token
En la autenticación por token, cuando el cliente se ha podido validar como un usuario de la aplicación, recibe una cadena encriptada como respuesta. Esa cadena es el token y sirve para que en los siguientes accesos, el usuario pueda informar al servidor que ya ha pasado por el proceso de autenticación.
En el siguiente diagrama, podemos ver cómo se realiza la recepción del token por parte del usuario. Primero, se envía la correspondiente información de login y, en caso que se haya validado correctamente en el servidor, se devuelve el token al cliente.
Envío del token en los siguientes accesos a la página
Cada vez que el cliente deba realizar nuevas solicitudes al servidor, certificando que es un usuario correctamente autenticado, tendrá que enviar el token de nuevo al servidor. Por lo tanto, una vez recibido el token, deberá ser almacenado del lado del cliente para enviarlo con las posteriores solicitudes. En estos casos, el token suele viajar en las cabeceras del HTTP, de modo que llegue al servidor.
El servidor que recibe el token tiene la capacidad de desencriptarlo, de modo que pueda comprobar qué usuario es el que está realizando esta solicitud. Durante el proceso de decodificación del token, el servidor puede comprobar si este es válido y si resulta serlo, puede recuperar toda la información encriptada en el mismo, que suele ser al menos la referencia inequívoca del usuario involucrado. Por supuesto, si en cualquier momento se detecta que el token no es correcto, se obligará al usuario a autenticarse nuevamente.
Generación y validación del token de API Rest
Para que la aplicación genere las cadenas de token y las pueda verificar, se utiliza programación del lado del servidor. Para la realización de todas estas operativas, generalmente, las aplicaciones se apoyan en librerías, que dependen de la tecnología de backend que se esté usando en el lado del servidor. Una muy común y sencilla de usar es JWT (JSON Web Token), que tiene implementaciones en diversos lenguajes.
Estas librerías, por lo general, liberan al desarrollador de la carga de trabajo más compleja de este proceso, ofreciendo una interfaz sencilla para la programación. Por ejemplo, ayudará a comprobar la validez de los token, asegurándose de que tengan un tiempo de caducidad configurable.