Credenciales y Principales
Vincent Depassier · 30 de agosto de 2026
Todo lo que llega al API Gateway trae una credencial. Esta página es sobre qué es realmente una credencial, a quién pertenece, y qué otorga y qué no.
Se administran en API Gateway → API Keys.
El modelo de dos niveles
Praxsuite separa quién llama de qué está sosteniendo.
Principal — la identidad ej. "App Móvil", "Zapier", "Claude MCP"
|
+--- Credencial — una key que prueba que sos eso
+--- Credencial — otra, para otro entornoUn principal es el actor. Tiene un código, un nombre visible, un tipo y un estado.
Una credencial es un secreto emitido a ese principal. Un principal puede tener varias: una por entorno, o una entrando mientras la vieja sale.
Esa separación es lo que hace segura la rotación. Revocar una key filtrada no borra la identidad, no toca sus permisos, y no afecta a ninguna otra key del mismo principal. Emitís un reemplazo y la configuración de la integración — scopes, filtros, permisos de herramientas — queda intacta, porque esa configuración cuelga de la credencial que estás reemplazando, no de un nombre que alguien tenga que volver a tipear.
Tipos de principal
Tipo | Para |
| Un backend, un script, una integración, un conector de IA |
| Un usuario de tu propia app, logueado por el gateway |
| Un agente corriendo fuera de tu infraestructura |
| Un dispositivo |
Service es lo que querés para cualquier cosa del lado del servidor. Los principales EndUser no se crean a mano — aparecen cuando una persona se loguea por los endpoints de auth del gateway.
Tipos de key, y dónde va cada una
El prefijo no es decoración. Te dice dónde puede vivir la key.
Prefijo | Nombre | Dónde va |
| Server Key | Solo del lado del servidor — un backend, un job, un conector MCP |
| Publishable Key | Un bundle de navegador, una app móvil, cualquier lugar que el público pueda leer |
Una publishable key es pública. Tratala como ya filtrada, porque en un bundle de frontend lo está. Eso no es una falla — es lo que significa "publishable". La protección viene de lo que permiten sus scopes, no de que la key se mantenga secreta. Una key pk_live_ debería poder hacer exactamente lo que un visitante anónimo de tu app puede hacer, y nada más.
Una key sk_live_ es lo contrario: es un secreto al portador, y cualquier cosa que la tenga puede hacer todo lo que sus scopes permitan. Nunca va en un repositorio, en código de cliente, ni en una URL.
El endpoint MCP acepta solo
sk_live_. Una publishable key se rechaza ahí, a propósito.
Tipos de credencial
Además de las API keys comunes, el modelo contempla ClientSecret, SignedToken, ClientCertificate, AgentSecret y DeviceSecret para escenarios OAuth y de edge. Para una integración normal, ApiKey es la que querés.
Ciclo de vida
Una credencial siempre está en exactamente un estado:
Estado | Significado |
| Funciona |
| Pasó su |
| Apagada a propósito |
| Apagada porque se filtró — se registra aparte para que la auditoría diga por qué |
| Pausada |
Cualquier cosa que no sea Active responde 403 FORBIDDEN. Lo mismo si el principal no está activo — suspender una identidad apaga todas sus keys de una, que es la palanca rápida cuando todavía no sabés cuál se filtró.
Una key nueva se muestra exactamente una vez. Solo se guarda un hash de una vía, así que nada en la plataforma puede volver a mostrártela. Si se pierde, emitís una nueva y revocás la vieja — no hay recuperación, por diseño.
Vale la pena setear ExpiresAt incluso sin plan de rotación. Un vencimiento convierte "nos olvidamos de esa integración" en una caída que notás, en vez de una key que sobrevive al proyecto que la creó.
El gateway registra LastUsedAt y LastUsedIp por credencial. Ese es el campo a mirar antes de revocar algo que nadie recuerda haber creado.
Los tres ejes de permisos
Una credencial lleva tres conjuntos de permisos independientes. Están separados porque protegen cosas distintas.
Eje | Gobierna | Se configura en |
Scopes de tabla | Qué tablas y columnas puede leer y escribir, con row filters y enmascarado | la pestaña Data de la key — ver Modelo de Seguridad |
Docs scopes | Qué carpetas, espacios y documentos puede alcanzar | la pestaña Docs de la key |
Permisos de herramientas | Qué grupos de herramientas MCP puede siquiera llamar | la pestaña Tools de la key |
Ninguno puede ampliar lo que otro niega. Otorgar el grupo de herramientas Docs no otorga acceso a un documento que los Docs scopes excluyen; permitir una tabla no habilita una herramienta que está apagada. Un request tiene que pasar todos los ejes que toca.
La consecuencia práctica al depurar un 403: revisá el eje que corresponde a la operación, no el que corresponde al dato. Una llamada MCP que no puede leer una tabla puede estar bloqueada por el scope de tabla o por el grupo de herramientas, y los dos se configuran en lugares distintos.
Caché de respuestas
Una credencial puede cachear sus propias respuestas de consulta:
Modo | Comportamiento |
| Todo request se ejecuta (por defecto) |
| Cacheado por |
| Cacheado hasta que se escriba en la tabla subyacente |
| Se invalida en escrituras, con el TTL como red de seguridad |
Los defaults son 60 segundos y 500 entradas.
WriteInvalidated es el interesante: te da un caché que no puede servir datos viejos después de una escritura que hizo tu workspace. Su punto ciego son los datos cambiados por algo que el gateway no vio, y para eso existe Hybrid.
El caché es por credencial, así que una key pública con mucha lectura puede cachear agresivamente mientras tu key de backend no cachea nada.
URLs de archivos
FileUrlMode decide cómo vuelven las columnas File e Image en los resultados:
Modo | Resultado |
| Una URL que pasa por el endpoint |
| Una URL prefirmada y con vencimiento, usable directo en un |
Proxy mantiene todo acceso a archivo detrás del mismo chequeo de permisos que la fila de la que salió. SasUrl cambia eso por URLs que un navegador puede cargar sin credenciales, que es lo que necesitás para una galería pública — y exactamente lo que no querés para documentos privados, porque cualquiera con la URL puede abrirla hasta que venza.
FileSasExpiryMinutes viene en 60, con piso de 5 minutos y techo de 7 días. Mantenelo corto: el vencimiento es lo único que limita una URL una vez que salió de tu página.
Recomendaciones prácticas
Una credencial por integración. Las keys compartidas vuelven inútil el log de auditoría y convierten una rotación en una caída coordinada.
Dale el scope de lo que la integración hace hoy. Un scope es trivial de ampliar después e imposible de des-filtrar.
Nunca dejes que una key `pk_live_` escriba algo que un visitante no debería poder escribir desde la consola del navegador.
Poné un vencimiento aunque no tengas plan de rotación.
Mirá `LastUsedAt` antes de revocar. Es la diferencia entre sacar una key muerta y bajar producción.
Siguiente
Modelo de Seguridad de PraxQL — cómo se aplica el eje de datos, capa por capa.