Ticker

6/recent/ticker-posts

Autenticación basada en Token

En este articulo pretendo demostrar las formas de mayor uso para la autentificación por token.

Autenticación en el servidor:

Se logra almacenando la sesión de inicio en la propia interfaz de la aplicación web (también llamado sesión de lado del cliente), lo más usado desde hace unos 2 a 3 años atrás, consiste básicamente en guardar en una sesión propia de la aplicación web toda la información del usuario. 

Inicialmente necesitamos almacenar la información en una base de datos con el fin de contrasta la información, seguidamente se podría almacenar en una colección de nuestra aplicación para el uso de la sesión. Sin embargo esto normalmente no brinda la escalabilidad en nuestra aplicación, ya que el servidor debe almacenar un registro por cada vez que el usuario se autentique a la aplicación; asimismo forzamos a que el Backend se sobrecargue por todas la peticiones que se pueda realizar, y que pasaría si queremos expandir nuestro desarrollo para una aplicación móvil u otro tipo de solución, necesitaríamos implementar otros backend diferentes con el fin de poder autentificarse.

Autenticación con JSON Web Tokens

Este tipo de autenticación es utilizar JSON Web Token (JWT). JWT es un estándar abierto para transmitir de forma segura información entre partes en un objeto JSON. La diferencia que la autentificación en el servidor el Token no se almacena en el servidor, si no en el lado del cliente (por ejemplo en localStorage o sessionStorage) y el API es el que se encarga de descrifrar ese Token y redirigir el flujo de la aplicación web en un sentido u otro.

Al igual que las APIs, el formato JSON es transparente del lenguaje, es decir se puede utilizar cualquier lenguaje de programación para su implementación (NET, Java, Node.js, Python, Ruby, yPHP).

JWT es compacto, legible y firmado digitalmente mediante una clave privada o un par de claves públicas por parte del proveedor de identidad (IdP). Las partes involucradas pueden verificar la integridad y autenticidad del token.

El propósito de utilizar JWT no es ocultar datos sino garantizar la autenticidad de los datos, todo JWT está firmado y codificado, no encriptada; es decir es un mecanismo de autenticación sin estado basado en token. Dado que es una sesión sin estado basada en el lado del cliente, el servidor no tiene que depender completamente de un almacén de datos (base de datos) para guardar la información de la sesión, ofreciendo una solución escalable y de usabilidad, es decir podríamos usar el mismo API para diferentes aplicaciones (Web, Mobile ya sea para Android o iOS, ...), para su uso sólo debemos preocuparnos de enviar los datos en formato JSON - generar y descrifrar tokens en la autenticación y posteriores enviar peticiones HTTP a través de un middleware.

JWT al no utilizar cookies para almacenar la información del usuario, nos ofrece mayor seguridad con el fin evitar ataques CSRF (Cross-Site Request Forgery) que manipulen la sesión que se envía al Backend. Al implementar un Token podemos administrar el tiempo que expire - considerando como una capa extra de seguridad.

Estructura de JWT

JSON Web Token consta de 3 partes separadas por un punto.


header.payload.signature

Header: La primera parte es la cabecera del token, que a su vez tiene otras dos partes, el tipo, en este caso un JWT y la codificación utilizada. Comunmente es el algoritmo HMAC, SHA256, RSA, HS256 o RS256

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload: EL Payload está compuesto por los llamados JWT Claims donde irán colocados los atributos que definen nuestro token, los más comunes son:
  1. Emisor (iss): Identifica al emisor del token.
  2. Asunto (sub): Es el asunto, que coincide con el identificador la persona que se identifica.
  3. Audiencia (aud): La audiencia para la que se ha emitido.
  4. Tiempo de vencimiento (exp): La hora de expiración, a partir de la cual, el token no será válido.
  5. Vigencia (nbf): Hora hasta la que no será aceptado un token (su omisión indica 0).
  6. Emitido en (iat): la hora a la que fue emitido.
  7. Identificados (jti): Identificador del token.
{
  "iss": "blog.hadsonpar.com",
  "sub": "proceso01",
  "name": "Hadson Paredes",
  "exp": 1516239022
}
Recuerden que también se puede añadir más campos, incluso personalizados, como el rol del usuario entre otros.
Signature: La firma es la tercera y última parte del JSON Web Token. Está formada por los anteriores componentes (Header y Payload) cifrados en Base64 con una clave secreta (almacenada en nuestro Backend) que sirve de Hash para comprobar que la autentificación este todo bien de acuerdo a la identidad y privilegios o claims en inglés.

HMACSHA256(
  base64UrlEncode(header) + "." +  base64UrlEncode(payload), secret
)

Al finalizar todo nuestro JSON Web Token, una vez codificado tendrá el siguiente valor:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJibG9nLmhhZHNvbnBhci5jb20iLCJzdWIiOiJwcm9jZXNvMDEiLCJuYW1lIjoiSGFkc29uIFBhcmVkZXMiLCJleHAiOjE1MTYyMzkwMjJ9.jMKauPSe0cqjlhOddDIPeP_oEfGOagSSYDlzTMvJQmg

Autenticación basada en Token es el procedimiento habitual para loguear a los usuarios, haciendo uso de APIs REST y recordarles para los futuros accesos al servicio web.

Documento de Referencia:


Déjanos sus comentarios y apreciaciones acerca del articulo y un fuerte abrazo para todos ✌...!!!

Publicar un comentario

0 Comentarios