Client Assertion (declaración del cliente)
Autenticación del cliente mediante el método private_key_jwt
La autenticación del cliente mediante el método private_key_jwt es una forma segura para que los clientes de OAuth 2.0/OpenID Connect se autentiquen en el servidor de autorización mediante un JWT (JSON Web Token) firmado con la clave privada del cliente.
Pasos para la autenticación del cliente con private_key_jwt
1. Un par de claves de firma generadas en el proceso de registro del cliente.
- La clave privada generada durante el registro del cliente (y a la que se hace referencia en el CSR) es para que el cliente la use al firmar tokens.
- El servidor de autorización (Redeban) almacena la clave pública correspondiente y la utiliza para verificar cualquier JWT que firme el cliente.
2. Registrar clave pública con el servidor de autorización (DCR)
- Durante el registro dinámico de cliente (DCR), el cliente comparte su clave pública (o URL JWKS) con el servidor de autorización:
- TLa URL de JWKS (org_jwks_endpoint) apunta a la ubicación donde el servidor de autorización puede recuperar las claves públicas del cliente.
- Opcionalmente, el cliente puede enviar una Declaración de Declaración de Software (SSA), una declaración firmada por el proveedor de software o la autoridad que describe los metadatos del cliente.
- Esto permite que el servidor de autorización valide los JWT firmados por la clave privada del cliente.
3. Generar un JWT para autenticación
- El cliente crea un JWT que contiene las siguientes declaraciones (claims):
- iss (issuer): El ID de cliente del participante.
- sub (subject): El ID de cliente del participante.
- aud (audience): La URL del servidor de autorización.
- jti (JWT ID): Un identificador único para el JWT (evita ataques de repetición).
- exp (expiration): Hora de vencimiento a partir de la cual el JWT no debe aceptarse para su procesamiento.
- El payload de JWT garantiza que la solicitud sea reciente, única y dirigida al endpoint correcto.
4. Firma el JWT
- El cliente firma el JWT usando su clave privada (comúnmente con el algoritmo PS256).
5. Enviar solicitud de autenticación al endpoint del token
- El cliente envía una solicitud POST al endpoint del token OAuth2 que incluye:
- client_id: El identificador del cliente.
- client_assertion_type: Siempre
urn:ietf:params:oauth:client-assertion-type:jwt-bearer. - client_assertion: El JWT firmado.
- Otros parámetros OAuth2 requeridos para el flujo (por ejemplo, Grant_type).
6. Validación JWT del servidor de autorización
- El servidor de autorización realiza estas comprobaciones:
- Obtiene la clave pública del cliente desde el endpoint JWKS o el certificado registrado durante DCR.
- Verifica la firma JWT usando la clave pública.
- Valida los claims:
- aud debe coincidir con el endpoint del token.
- exp se debe garantizar que no ha caducado.
- jti debe ser una llave única.
- iss y sub deben coincidir con el cliente registrado.
7. Emisión de tokens
- Si el JWT es válido y todas las claims pasan la verificación, el servidor de autorización emite los tokens solicitados (token de acceso, token de actualización, etc.) al cliente.
Ejemplo de JWT de afirmación del cliente
eyJhbGciOiJQUzI1NiIsImtpZCI6Ijc2OEtSRWJUanRjckh2ZDdxcng3VjZsWU5YST0ifQ.eyJqdGkiOiJteUpXVElkMDAxIiwic3ViIjoiU0MtMTVlNTViZjgtYmU0OS00ZTMxLWExMmQtNjVhY2QzOTZjMzM3IiwiaXNzIjoiU0MtMTVlNTViZjgtYmU0OS00ZTMxLWExMmQtNjVhY2QzOTZjMzM3IiwiYXVkIjoiaHR0cHM6Ly9hdXRoLnN0YWdlLnJlZGViYW5vcGVuZmluYW5jZS5jb20iLCJpYXQiOjE3MzQ2OTQxMzksImV4cCI6MTc2NzE4NTgyNn0.NjwSF-_8nuc-BRp29ZPqYPcrtvAZdCF8GJkJNDPhJMbeDz3Va0O3GJvFj1LOQwRqcz8IYQUeRcKuPlzaLNwjz4hwhau-x6evArlQ4pkx_nvUmiKEmh4hPzRkgaJMRWyI56KgDL9cOk-0RS2ucAEUBuwWKSbSASuMo1hQnEjd-sL0VZEk7Ulier0TLBOE20KEW17Z-Ira5HrkHBZNgBEaBbKth6sntZD34BOiVB6SpDM-Tg2KjQBLLGCwXq44EfT9FtHhostmGQ3ovzZvxsgYwsW6U_mLBi9xJLDBELAtTCSR7s1S5Ae-X3OLfunB4-iBmcNtvmIrB0Cz7Sz_51bptAEjemplo de payload JWT
Header:
{
"alg": "PS256",
"kid": "768KREbTjtcrHvd7qrx7V6lYNXI="
}Payload:
{
"jti": "myJWTId001",
"sub": "SC-15e55bf8-be49-4e31-a12d-65acd396c337",
"iss": "SC-15e55bf8-be49-4e31-a12d-65acd396c337",
"aud": "https://auth.stage.redebanopenfinance.com",
"iat": 1734694139,
"exp": 1767185826
}
Consulte el estándar definido en https://datatracker.ietf.org/doc/html/rfc7523