Para consumir los servicios que requieren autenticación mediante un JWT firmado, es necesario construir un token compuesto por tres partes:
- Header: define el algoritmo de firma y el identificador de la llave utilizada.
- Payload (Body): contiene los claims o atributos del token.
- Signature: se genera firmando el JWT con la llave privada configurada.
Estructura del JWT
{
"header": {
"alg": "RS256",
"kid": "{{kid-local}}"
},
"body": {
"aud": "{{issuer}}",
"exp": {{exp}},
"iss": "{{client_id}}",
"sub": "{{client_id}}",
"jti": "{{$guid}}",
"iat": {{iat}}
},
"signingKeyPEM": "{{pem-local}}"
}
Header
El encabezado define el algoritmo utilizado para firmar el token y el identificador de la llave asociada a la firma.
alg
Algoritmo de firma utilizado para generar la firma digital del JWT.
Valor:
RS256
Este algoritmo utiliza RSA con SHA-256 y garantiza la integridad y autenticidad del token.
kid
Identificador de la llave pública registrada para validar la firma del JWT.
Valor:
{{kid-local}}
Debe corresponder al valor del campo kid de la llave pública previamente registrada en el endpoint JWKS.
Payload (Body)
El cuerpo del JWT contiene los claims requeridos para identificar al cliente y validar el token.
aud (Audience)
Identifica el destinatario del JWT.
Valor:
{{issuer}}
Este valor puede obtenerse consultando el endpoint de OpenID Connect (OIDC), específicamente el campo:
issuer
exp (Expiration Time)
Fecha y hora de expiración del JWT, expresada como un timestamp Unix en segundos.
Valor:
{{exp}}
Una vez alcanzado este tiempo, el token dejará de ser válido.
iss (Issuer)
Identifica al emisor del JWT.
Valor:
{{client_id}}
Debe contener el client_id asignado a la aplicación consumidora y suministrado junto con sus credenciales.
sub (Subject)
Identifica al sujeto del token.
Valor:
{{client_id}}
Para este flujo, el valor corresponde al mismo client_id de la aplicación.
jti (JWT ID)
Identificador único del JWT.
Valor:
{{$guid}}
Se recomienda generar un GUID único para cada token emitido, con el fin de evitar reutilizaciones y mitigar ataques de repetición (replay attacks).
iat (Issued At)
Fecha y hora en la que el JWT fue generado, expresada como un timestamp Unix en segundos.
Valor:
{{iat}}
Permite validar el momento de emisión del token.
Llave de firma
signingKeyPEM
Llave privada utilizada para generar la firma digital del JWT.
Valor:
{{pem-local}}
La llave debe encontrarse en formato PEM y corresponder a la llave pública asociada al kid configurado en el encabezado del JWT.
Ejemplo
{
"header": {
"alg": "RS256",
"kid": "12345678-abcd-1234-abcd-123456789abc"
},
"body": {
"aud": "https://auth.example.com",
"exp": 1748377200,
"iss": "aa4d89ef-da18-4e16-83b3-c21dd0e12345",
"sub": "aa4d89ef-da18-4e16-83b3-c21dd0e12345",
"jti": "e5d0ef0f-3f6c-4db2-8db5-4e5c71d32f5d",
"iat": 1748376900
}
}
Firma del JWT
Una vez construidos el header y el payload, ambos deben codificarse utilizando el formato Base64URL y firmarse mediante la llave privada (signingKeyPEM) utilizando el algoritmo RS256.
El resultado será un JWT con la siguiente estructura:
Base64Url(header).Base64Url(payload).Base64Url(signature)
Este token podrá utilizarse posteriormente para autenticar las solicitudes realizadas a los servicios de Open Banking.
Comentarios
0 comentarios
El artículo está cerrado para comentarios.