ADR-002 — Autenticación: OAuth2 client credentials + API key + perfil ApiClientes¶
Fecha: 2026-10-22 Estado: Aceptada
Contexto¶
ApiIntegracionesExternas(rl7zt6zak5) usa el pool Cognitous-east-1_6jmSkfK4B(3 usuarios).POST /tokenhace login con usuario y contraseña (USER_PASSWORD_AUTH) víaAPILambdaObtenerToken; no hayclient_credentials, scopes, WAF ni usage plans.- El authorizer valida el header
Authorization, peroApiLambaConsultarPedidoslee primero el headerToken(Function.cs:51-57) y solo decodifica el JWT sin verificar firma (JwtClaimsHelper.cs:17-30). - Se requiere: muy seguro, bloqueo inmediato, permisos por tienda/producto/transportadora, trazabilidad.
Opciones¶
| Opción | Resumen | Problema |
|---|---|---|
| Usuario y contraseña Cognito (actual) | Contraseña humana en sistemas de terceros | Débil; sin scopes; sin refresh |
| Solo API key | Simple | Llave de larga vida; API key no es autenticación |
| Client credentials + API key + perfil en Mongo | Estándar máquina a máquina | Un header más para el integrador |
Decisión¶
- Cognito
client_credentials: un app client con secreto por integrador en el pool6jmSkfK4B; resource server con scopesguias:crear,guias:leer,guias:anular,cupo:leer; access token corto. El authorizer exige el scope de cada método. - API key + usage plan por cliente: límite y cuota por cliente en el gateway; desactivar la key bloquea de inmediato.
- Perfil
ApiClientes: estado (ACTIVO/BLOQUEADO/SUSPENDIDO_CUPO), tiendas, productos, transportadoras, límites, IPs permitidas. Se consulta en cada request con caché de 30 s. - WAF regional: reglas administradas, límite por IP, lista de IPs bloqueadas.
- Las tiendas y permisos salen solo del perfil en servidor.
ApiClientes unifica también a los usuarios de /pedidos (absorbe ApiUsuariosTiendas de la rama feature/mejora-api-pedidos). /pedidos y sus 3 usuarios siguen igual hasta su migración.
Consecuencias¶
- Bloqueo: cambiar estado en
ApiClientes(≤ 30 s) + desactivar API key (inmediato) + IP en WAF si aplica. - Rotación de secreto: nuevo app client, periodo de gracia, baja del anterior.
- Pendiente aparte: en
/pedidos, leer soloAuthorizationo los claims del authorizer.