Una vez que tienes el JWT y la firma RSA, solicita el userToken al endpoint de autorización.
GET /hosts/{hostId}/authorize-user
| Header | Valor | Descripción |
|---|
Authorization | Bearer {jwt} | JWT generado en el paso anterior |
X-CM-Timestamp | {timestamp} | Mismo timestamp usado en la firma |
X-CM-Signature | {signature} | Firma RSA-SHA256 en Base64 |
X-CM-HOST-ID | {hostId} | Tu identificador de host |
X-CM-Client-ID | {clientId} | Tu identificador de cliente |
Content-Type | application/json | Tipo de contenido |
Terminal
curl -X GET "https://hola.passbeneficios.com/hosts/{hostId}/authorize-user" \
-H "Authorization: Bearer {jwt}" \
-H "X-CM-Timestamp: 1710000000000" \
-H "X-CM-Signature: {firma-rsa-base64}" \
-H "X-CM-HOST-ID: {hostId}" \
-H "X-CM-Client-ID: {clientId}" \
-H "Content-Type: application/json"
authorize.js
const endpoint = `/hosts/${hostId}/authorize-user`;
const { signature, timestamp } = await signRequest(
clientId,
"GET",
endpoint,
null,
hostId,
token
);
const response = await fetch(
`${process.env.CM_API_URL}${endpoint}`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"X-CM-Timestamp": timestamp,
"X-CM-Signature": signature,
"X-CM-HOST-ID": hostId,
"X-CM-Client-ID": clientId,
"Content-Type": "application/json",
},
}
);
const data = await response.json();
// data.userToken → token para el iframe
Respuesta
{
"userToken": "eyJhbGciOiJIUzI1NiIs..."
}
| Campo | Tipo | Descripción |
|---|
userToken | string | Token de sesión del usuario en el marketplace. Validez: 1 hora. |
| Código | Causa | Solución |
|---|
401 | JWT expirado o inválido | Verifica que el JWT tenga menos de 5 minutos y que tu CM_JWT_SECRET corresponda al secretId entregado por Präna |
403 | Firma RSA inválida | Verifica que la llave privada corresponda a la pública registrada en Präna |
422 | Datos del usuario incompletos | Asegúrate de enviar email, name y paternalLastName en el JWT |
Con el userToken obtenido, procede a Montar el iframe.