Skip to content

Protocolo JWT en Laracloak ​

Este documento describe la especificación técnica de los JSON Web Tokens (JWT) generados por el sistema de credenciales de Laracloak para autenticarse contra servicios upstream.

Librería y Algoritmos ​

  • Librería: firebase/php-jwt v6.0+
  • Algoritmo por defecto: HS256 (HMAC con SHA-256).
  • Algoritmos soportados: Todos los soportados por la librería para firma simétrica (HS384, HS512, etc.), siempre que credential.auth_value contenga la clave secreta.

Estructura del Token ​

El token generado consta de tres partes: Header, Payload y Signature.

1. Header ​

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

El algoritmo (alg) es configurable mediante settings.alg.

2. Payload ​

El payload incluye claims estándar y personalizados.

Claims Estándar (Automáticos) ​

ClaimDescripciónValor
issIssuer (Emisor)config('app.url') (La URL base de Laracloak)
iatIssued At (Emitido)Timestamp actual (fijado en el momento de la petición)
expExpiration (Expira)iat + 60 segundos
nbfNot Before(No establecido por defecto)

Claims Personalizados ​

Cualquier par clave-valor definido en credential.settings.claims se fusionará en el payload, sobrescribiendo los calculados automáticamente si coinciden las claves.

Ejemplo de Payload Final:

json
{
  "iss": "https://laracloak.internal",
  "iat": 1708000000,
  "exp": 1708000060,
  "role": "service-account",
  "scope": "read:data"
}

3. Signature ​

La firma se genera utilizando el algoritmo especificado y la clave secreta almacenada en credential.auth_value.

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

Flujo de Autenticación ​

  1. Petición: Un usuario o sistema solicita un recurso a través de Laracloak que apunta a un upstream protegido.
  2. Resolución: Laracloak identifica la credencial asociada al upstream.
  3. Generación: Si la credencial es de tipo jwt y modo generation:
    • Se desencripta auth_value para obtener el secreto.
    • Se construye el payload.
    • Se firma el token.
  4. Inyección: El token se añade a la cabecera HTTP de la petición al upstream: Authorization: Bearer <token_generado>
  5. Envío: La petición firmada se envía al upstream.