Seguridad OAuth 2.0, scopes y gestión de secretos
14.1 Identidad
- Identity Provider (IdP): Se reutiliza el proveedor corporativo (actualmente Keycloak en Alpura). Credenciales y scopes por client_id.
- Flujo sistema-a-sistema:
client_credentials. - Token: JWT firmado asimétricamente (RS256 o ES256); validación por JWKS endpoint.
14.2 Scopes propuestos
| Scope | Uso |
|---|---|
nexus.purchase-order.create | Ingesta OC por partners |
nexus.purchase-order.read | Consulta de estados |
nexus.purchase-order.retry | Reproceso manual (Operadores) |
nexus.validation-rule.read | Lectura de reglas |
nexus.validation-rule.manage | Crear/modificar/activar reglas |
nexus.configuration.read | Lectura partners/mappings/config |
nexus.configuration.manage | Gestión de partners y configuración |
14.3 Roles RBAC (TBD IdP realm roles)
| Role | Scopes mínimos asignados |
|---|---|
NEXUS_PARTNER_SYSTEM | nexus.purchase-order.create + nexus.purchase-order.read (solo partnerId propio) |
NEXUS_OPERATOR | nexus.purchase-order.read + nexus.purchase-order.retry + nexus.validation-rule.read |
NEXUS_ADMIN | Todos: *.manage + *.read + retry |
14.4 Seguridad en APIs
| Medida | Implementación |
|---|---|
| Autenticación | @PreAuthorize("hasAuthority('SCOPE_nexus.purchase-order.create')") en Spring |
| Autorización por partner | Filter: valida que el partner claim (o una asignación IdP) coincida con X-Partner-Id; si roles superiores, permitir cross-partner. |
| Idempotencia | X-Idempotency-Key obligatorio + UNIQUE en DB. |
| Rate limiting | API Gateway (límites por client/partner). |
| TLS | Terminado en Gateway; mTLS a servicios internos TBD. |
| Secretos | NO hardcodear. Usar Google Secret Manager / HashiCorp Vault TBD. Rotación planificada. |
| Logging | Siempre borrar PII sensible (tokens, credenciales, payment details). |
| Auditoría | audit_event por cada request, cambio de regla y retry manual. |
14.5 Token y expiración
| Tipo | Tiempo TBD |
|---|---|
access_token (client credentials) | 5-15 min TBD |
refresh_token | N/A en client credentials |
| Rotación client secret | Cada TBD 90 días; soporte para 2 secrets activos simultáneamente (rotation sin downtime). |
14.6 Separación por ambientes
| Ambiente | Realm / client prefix |
|---|---|
| Dev | realm=Alpura-Dev, client: nexus-*-dev |
| UAT | realm=Alpura-UAT, client: nexus-*-uat |
| Prod | realm=Alpura, client: nexus-* |
Las bases de datos, topics Pub/Sub, vault paths y endpoints Fusion deben separados o con segmentación estricta por ambiente TBD.