¿Qué es Json Web Token y cómo funciona? arrow2-down

Introducción

Este documento tiene el objetivo de ser una guía práctica para generar y validar JWTs. JWT (JSON Web Tokens) es un estándar abierto que define una forma compacta y autocontenida para compartir información entre dos componentes como objetos JSON. Esta información puede ser verificada ya que se encuentra firmada digitalmente. Los JWTs pueden ser firmados usando un secreto (Con el algoritmo HMAC) o con un par de llaves privada y pública usando RSA o ECDSA.

 

Un JWT puede ser firmado o cifrado, para este escenario usamos JWTs firmados y en su forma compacta. Un JWT tiene tres elementos:

  • Header: es el que contiene la información de que algoritmo se usa para firmar el mensaje
  • Payload: es la información a compartir que se quiere firmar y verificar digitalmente
  • Signature: es la firma resultado del procesamiento del header y el payload con el algoritmo definido en el header y la llave privada o secreto establecido.

La forma compacta del JWT se conforma de los 3 elementos anteriores separados por punto de la siguiente manera: base64URL(Header).base64URL(Payload).Signature.

 

Donde el Signature es la firma y se genera firmando el header y el payload.

 

Ejemplo: 

Signature = RSASHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), llavePrivada)

Y al final queda una cadena similar a esta:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.POstGetfAytaZS82wHcjoTyoqhMyxXiWdR7Nn7A29DNSl0EiXLdwJ6xC6AfgZWF1bOsS_TuYI3OG85AmiExREkrS6tDfTQ2B3WXlrr-wp5AokiRbz3_oB4OxG-W9KcEEbDRcZc0nH3L7LzYptiy1PtAylQGxHTWZXtGz4ht0bAecBgmpdgXMguEIcoqPJ1n3pIWk_dUZegpqx0Lka21H6XxUTxiy8OcaarA8zdnPUnV6AmNP3ecFawIFYdvJB_cm-GvpCSbr8G8y_Mllj8f4x9nBH8pQux89_6gUY618iYv7tuPWBFfEbLxtF2pZS6YC1aSfLQxeNe8djT9YjpvRZA

 

 

Instalación y configuración SSL

Para iniciar con la generación de un JWT es necesario tener instalado OpenSSL, aquí veremos el paso a paso de su instalación para el sistema operativo Windows.

  • Descargaremos el instalador desde la página SHINING LIGTH PRODUCTIONS desde aquí escogeremos la versión para desarrolladores y el tipo de sistema operativo según sea el caso (win32 o win64)Yimage1.jpg
  • Ejecutar el archivo de instalación descargado y seguir las instrucciones como lo muestra las siguientes imágenes:yimage2.pngimage3.pngimage4.pngimage5.png

Al finalizar la instalación nos mostrara la siguiente ventana, desmarcamos las casillas y  damos click en Finish.

image6.png

Para comprobar la correcta instalación de OpesSSL y su versión instalada. Procedemos a abrir una ventana de comandos (CMD) y escribimos la siguiente instrucción: openssL version y presionamos la tecla Enter

image7.png

     Luego de comprobar que la instalación fue correcta procedemos con la generación del JWT.

 

 

Generar el JWT

Para generar un JWT usando el algoritmo RS256 se debe contar con una llave privada para firmarlo y con un certificado para verificarlo.

Esta sección presenta:

  • Como generar una llave privada y certificado de prueba.
  • Como generar un JWT de prueba.
  • Como verificar sin un JWT es válido con el certificado.

 

Llave privada y llave pública

 

Para pruebas

Para pruebas se puede usar un certificado autofirmado, para generarlo se puede usar openssl, el git bash tiene esta herramienta:

 

Comando: 

 

openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

 

Información de EJEMPLO:

  • Country Name: CO
  • State or Province: ANTIOQUIA
  • Locality Name: MEDELLIN
  • Organization Name: Mi Organization S.A
  • Organizational Unit Name: BANCOLOMBIA
  • Common Name: nombreapp.apps.ambientesbc.com

 

El Common Name es el nombre de dominio de la app para la que se genera el certificado, para efectos de prueba en este caso se asignó el valor nombreapp.apps.ambientesbc.com.

image8.png

Como resultado se generan dos archivos, la llave privada y el certificado, el primer archivo es el que se usa para firmar el JWT y el segundo es el que se puede usar como llave publica con la cual verificamos la firma del JWT. Al abrirlas con un editor de texto

 

Key.pem (llave privada)

image9.png

Certificate.pem (Certificado que contiene llave pública)

image10.png

Herramienta de prueba para generar y validar JWT

Para generar un JWT con la llave privada de prueba se puede usar la herramienta online https://jwt.io/.

 

Generar JWT

Para las pruebas se deben ingresan los datos:

Algorithm: RS256

image11.png

generar un nuevo Payload con los siguientes pasos.

 

Donde:

  • iss: es un el nombre de quien genera el JWT, para el caso del banco se debe asignar el AW de la aplicación que genera el JWT.
  • sub: identifica para quien se genera el token, debe ser API Key o client_id de la APP en el portal.
  • aud: Identifica el grupo o la audiencia para quien se genera el JWT, este dato puede ser un arreglo, para API Connect debe ser APIGateway_XXX (Donde el xxx son las letras del API GW donde está expuesta la API: LAN, DMZ, AWS).
  • exp: Es la fecha en la cual el token expira. Es un número en formato NumericDate. Es un timestamp en segundos. Ejemplo: 1588628816.194 o 1588628816. El JWT deja de ser valido una vez se pase de esta fecha. Para producción este valor no puede ser mayor a 1 minuto después de la fecha de generación del token.
  • iat: es la fecha en la cual se genera el token. Es un número en formato NumericDate. Es un timestamp en segundos. Ejemplo: 1588628816.194 o 1588628816.

Nota: Ejemplo para generar estos valores en Javascript

var iat = new Date()/1000; //1588630053.851

var exp = iat + 60*60; //1588633653.851
  • nonce: es un valor aleatorio de más de 10 caracteres hexadecimales o 20 numéricos.
  • Ejemplo para generar estos valores en Javascript con nonce de 12 de longitud, el exp en el ejemplo es de 1 hora después de la fecha de generación del token para efectos de prueba:
let iat = new Date()/1000;
let exp = iat + 60*60;
let min = 17592186044416;//Hex 1000000000000
let max = 281474976710655;//Hex ffffffffffff
let nonce = Math.floor((Math.random() * (max - min + 1)) + min).toString(16);
let jwtPayload = {
    iss: "AW1234001",
    sum: "bcf78354-c07a-4273-a26a-49b20acd8e45",
    aud: "APIGateway_DMZ",
    exp: exp,
    iat: iat,
    nonce: nonce
}
console.log(JSON.stringify(jwtPayload));
  • Este código se pude ejecutar en Google Chrome en la consola de inspeccionar (dando f12 o clic derecho->inspeccionar)image12.png

Se pega en la sección de payload lo que se imprime en consolaimage13.png

Y en verify signature donde dice private Key se pega el texto de la llave privada.image14.png

Esto hace que en la sección que dice Encoded se genere un JWT válido que se puede enviar a la API.image15.png

El JWT generado

 

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJOb21icmVBUFAiLCJzdW0iOiJiY2Y3ODM1NC1jMDdhLTQyNzMtYTI2YS00OWIyMGFjZDhlNDUiLCJhdWQiOiJCYW5jb2xvbWJpYSIsImV4cCI6MTU4ODYzNDUxOC41NTMsImlhdCI6MTU4ODYzMDkxOC41NTN9.lFnJ0JdgLXYYjHxLVfsmi1crRnVTzpbpfBatQwQpSuGIuekSc9oGvRekVGQeL5so4qr2_7h1mlLN7JkT4s8YUzJiDwy7dIFfs_ebYj5oDqAVTVJN_6KgZUtAdaIaP5pcDX7WOstSZNXfeAcOiXBy4kG-DiRW8KHoNrNN9-pnPOKv4wrhpDTTgAzoILlMwgiakA3ayXXoUUIARnrj7emyJ6DDuT1DDFwPMj64tD4db_8xDKf7Pwb7VWUIXb4HxGUY4cuXIuIO4SW7J9T1JCeBQLTmo6_ttrZaFLfyzlJnGAd_Cp5-gE5K1A-iMp77f7VyaXZctjj8eEP6JYB5OlJoBg

 

Verificar JWT

Si se desea verificar un JWT se deben ingresar el JWT a verificar en el campo “Encoded” e ingresar en donde dice Public Key or Certificate el certificado con el que se va a verificar el JWT.image16.png

Enviar el certificado público para poder adjuntarlo a la aplicación, poder autenticarse y realizar el consumo. 

 

⚠️ Aquí te hemos brindado unos consejos generales sobre cómo crear y validar certificados y tokens JWT (JSON Web Tokens) en entornos de desarrollo. No es una guía definitiva ni asesoría legal o de seguridad. Es esencial entender que las prácticas recomendadas aquí son para pruebas y desarrollo, no se sugiere aplicarlas en entornos reales sin primero revisarlas con expertos en seguridad. Así mismo, generar tokens JWT involucra información delicada y claves privadas, compartirlas acá o en otro lado es un riesgo.

 

Cualquier acción que tomes basada en esta información es bajo tu responsabilidad. 

 

JWT arrow2-down

JWT (JSON Web Token) es un estándar abierto que define una forma compacta y autocontenida para compartir información entre dos componentes como objetos JSON.

Los JWT pueden ser firmados usando un secreto (Con el algoritmo HMAC) o con un par de llaves privada y pública usando RSA o ECDSA.

Tiene tres elementos:

  • Header: Contiene la información de que algoritmo se usa para firmar el mensaje
  • Payload: Es la información a compartir que se quiere firmar y verificar digitalmente
  • Signature: Es la firma resultado del procesamiento del header y el payload con el algoritmo definido en el header y la llave privada o secreto establecido. 

La forma compacta se conforma de los 3 elementos anteriores separados por punto de la siguiente manera:
base64URL(Header).base64URL(Payload).Signature

Para el consumo de las API usamos JWT firmados de forma asimétrica (usando llave publica y llave privada) en su forma compacta.

Cómo generar el certificado

Como indicábamos para asegurar la identidad del consumidor durante la comunicación entre la aplicación y el API es necesario generar un certificado.​

Se debe generar la llave pública y privada.

blobid4.png

 

Datos para generar el certificado

 

Información de ejemplo​

  • Country Name: Código de país. Ej: CO​
  • StateorProvince: Departamento. Eje: ANTIOQUIA​
  • LocalityName: Ciudad. Ej: MEDELLIN​
  • OrganizationName: Nombre de la Organización. Ej: Mi Organización S.A.​
  • OrganizationalUnitName: BANCOLOMBIA​
  • CommonName: miorganizacion.com​

 

Características recomendadas​

  • Tamaño de clave: 2048​
  • Algoritmo de firma:SHA256 con RSA​
  • Formato del certificadoX.509 codificado en base 64

 

Generación certificado

 

Puede utilizar la herramienta OpenSSL para la creación del certificado.​

  1. Genera el certificado SSL para el firmado del token con el siguiente comando:​

​opensslreq -newkey rsa:2048 -nodes -keyoutkey.pem -x509 -days 365 -outcertificate.pem​​

2. Ingresa a JSON Web Tokens -jwt.io en explorador de internet y configura RS256.​

3. Abre la herramienta de desarrollador en el navegador web.

blobid1.png
blobid2.png

 

Código NodeJS

 

  1. Pegar código NodeJS para generar el JSON del Web Token.​

​let iat= new Date()/1000;​

let exp= iat+ 600*60;​

let min = 17592186044416;//Hex1000000000000​

let max= 281474976710655;//Hexffffffffffff​

let nonce= Math.floor((Math.random() * (max-min + 1)) + min).toString(16);​

let jwtPayload= {​

iss: "PruebaPayAPP",​

sum: "ccb2eebf-889c-47b6-ad55-75346cf70a08",​

aud: “APIGateway_DMZ",​

scope:"ScopeBetween" ,​

exp: exp,​

iat: iat,​

nonce: nonce​

}​

console.log(JSON.stringify(jwtPayload));​

2. Copiar y pegar JSON generado en campo PAYLOAD DATA.

 

Ingresar resultado en el Payload

  1. En la casilla PayloadData, pegue el JSON resultado de la ejecución del código NodeJS.​
  2. El JWT es el resultado que aparece en la casilla Encoded, copie lo e ingréselo en el campo de la cabecera HTTP llamada json-web-token.​
  3. Igualmente pegue el texto del certificado público en el campo de la cabecera HTTP llamado X-Client-Certificate
blobid3.png
API Key arrow2-down

Una API Key actúa como un Token de autenticación secreto, o como un identificador único. Estas claves vienen junto con un conjunto de derechos de acceso para la API asociada.  

Diferencias entre OAuth 2.0 y JWT arrow2-down

La diferencia entre OAuth 2.0 y JWT, es que, OAuth es un framework que autoriza accesos a recursos de diversas aplicaciones por medio de un token, mientras que JWT es un protocolo de autenticación que genera, envía y valida el token de acceso. 

Es decir, que cumplen objetivos diferentes en el proceso de seguridad y protección de datos. 

OAuth arrow2-down

OAuth (Open Authorization) es un framework y estándar de seguridad que da a la aplicación cliente acceso a los datos del usuario, con ámbito (scope) y tiempos limitados. 

Este estándar no proporciona al consumidor las credenciales del usuario, desacoplando la autenticación y autorización de los datos. 

Y al especificar los ámbitos de una API en el registro de la aplicación cliente, esta puede obtener un token de acceso a un recurso concreto, por lo tanto, OAuth no es un protocolo de autenticación. 

Gracias a la autorización limitada a datos valiosos para el uso y consumo de las APIs, con un token de acceso, podemos proporcionarte una experiencia de acceso sin interrupciones y de inicio de sesión único, velando por la seguridad y la protección de los datos de nuestros usuarios.

 

OAuth provee diferentes tipos de flujo para la autenticación/autorización:

  • Authorization Code (Código de Autorización):En esta configuración, el usuario se autentica junto con el servidor de recursos y da al consentimiento de la app, el acceso a sus recursos protegidos sin delegar el nombre de usuario/contraseña a la app.
  • Implicit (Implícito): Este es un flujo para aplicaciones de una sola página (Single-Page Applications) 
  • Resource Owner Password Credentials (Flujo Password): se envían las credenciales del usuario final a través de la aplicación consumidora, permitiendo a la misma, conocer las credenciales.
  • Client Credentials (Flujo de Aplicación): Es usado cuando la aplicación consumidora no tiene interacción directa con el cliente y es una aplicación de confianza, debido que, para ejecutar este flujo, no se requiere de la autorización del usuario para acceder a su información. Los únicos datos que se validan en el servidor de OAuth son las credenciales de la aplicación consumidora.

 

De acuerdo con el flujo valida en la sección de seguridad de la API, que flujo está configurado para así mismo configurarlo en la aplicación consumidora.

 

A continuación, te brindamos el paso a paso para configurar el OAuth, en pruebas hechas en postman.

 

  1. Ubícate en la pestaña de Authorization.
  2. Selecciona en type: OAuth 2.0.
  3. En el campo Grant Type selecciona la opción de acuerdo con el flujo de la APIblobid0.png
  4. En el campo Access Token URL, verifica que la url sea la correspondiente.
  5. Registra tus credenciales de Client ID y Cliente Secret, que debes tener generadas al crear la aplicación en el portal.
  6. Registra el scope correspondiente a la capacidad a consumir, éste lo encuentras en el path de la operación.
  7. Oprime el botón Get New Access Tokeblobid1.png
  8. Aparecerá en una nueva ventana el token generado, en la cual deberás oprimir el botón Use Token.