1. Modelo de tokens
Distinción clave: los tokens ES256 demuestran identidad y son consumidos por la
app cliente — nunca llegan a las APIs de B Brands. El token HS256 es consumido
por las APIs de B Brands vía el autorizador interno existente.
Claims canónicos del token de acceso OAuth (identidad + dimensión de cuenta)
iss es siempre la URL auth.* por entorno; aud es
siempre la audiencia fija del IdP bbrands-idp; el cliente solicitante se transporta en
https://bbrands.io/client_handle; jti está siempre presente e impulsa la
blacklist; no hay claim de permisos ni de rol. El claim
https://bbrands.io/profile lleva solo contexto de tenancy: account es la
cuenta vinculada al usuario estrictamente mediante el rol primary_user (un
usuario primario por cuenta), odoo es el id del sistema externo de esa cuenta
(null hasta que la API de migración la mapee) y user es igual a sub. El
endpoint UserInfo devuelve el mismo objeto.
Validación del lado del cliente
2. Dónde vive la autorización
3. Gestión de secretos
Reglas de almacenamiento: nunca en el repositorio, nunca en los logs (enmascara los headers
Authorization), nunca en los payloads de webhook, cifrado en reposo, acceso restringido a los
administradores del IdP.
Rotación de client_secret
1
El administrador hace clic en Rotar
B Brands genera un nuevo secreto.
2
Período de gracia
El antiguo y el nuevo se aceptan simultáneamente durante una ventana de gracia configurable (por defecto 24h).
3
El cliente actualiza su config
En cualquier momento durante la ventana de gracia.
4
Termina la gracia
El secreto antiguo deja de aceptarse; la auditoría registra la rotación.
Rotación de la clave de firma ES256
El motor soporta rotación basada enkid. Genera la nueva clave, mantén ambas activas,
espera el TTL máximo del token de acceso (30 min) + buffer (1h), retira la clave antigua, luego
elimínala tras la retención. El endpoint JWKS debe exponer ambas durante la ventana.
4. Modelo de amenazas (mini-STRIDE)
5. Niveles de revocación
6. Requisitos de auditoría
- Inmutable: append-only, sin UPDATE/DELETE.
- Trazable:
actor,ip,user_agent,correlation_id. - Retención: 12 meses en línea, más tiempo en almacenamiento en frío.
- Exportable:
/idp/audit/users/:id/exportpara GDPR/compliance. - Nunca registrado: tokens completos (solo el prefijo del
jti), secretos en texto plano, contraseñas.