Conexiones y credenciales
Conexiones Externas — /external-connections

Datos de conexión reutilizables, registrados una vez y referenciados por varias Recolecciones y Entregas:
| Tipo | Usado por |
|---|---|
| MQTT Broker | Recolección MQTT_TOPIC_SUBSCRIBER, entrega MQTT_PUBLISH |
| SQL Server / Oracle | Recolección SQL_SERVER / ORACLE, entrega SQL_SERVER_EXEC / ORACLE_EXEC |
| PostgreSQL | Recolección POSTGRES, entrega POSTGRES_EXEC |
| SQLite | Recolección SQLITE, entrega SQLITE_EXEC — sin host ni usuario: la conexión es la ruta del archivo .db |
| InfluxDB | Recolección INFLUXDB, entrega INFLUXDB_WRITE — base de series temporales; una conexión atiende las versiones 1.8, 2.x y 3.x |
| SAP RFC | Recolección SAP_RFC, entrega SAP_RFC_CALL |
| SAP IDoc | Recolección SAP_IDOC |
| SAP Gateway (OData) | Aplicaciones SAP Gateway: recolecciones HTTP_GET/HTTP_POST y entregas HTTP_POST/PUT/PATCH/DELETE — ver SAP Gateway |
| SAP CPI (Cloud Integration) | Aplicaciones SAP CPI: recolecciones HTTP_GET/HTTP_POST y entregas HTTP_POST/PUT/PATCH/DELETE/SOAP — ver SAP CPI |
| MongoDB | Recolección MONGODB, entrega MONGODB_WRITE — incluye Atlas, Cosmos DB y DocumentDB |
| OPC UA | Recolección OPC_UA_TRIGGER, entrega OPC_UA_WRITE |
| Modbus TCP | Recolección MODBUS_TRIGGER / MODBUS_POLL, entrega MODBUS_WRITE |
| PI Web API | Recolección PI_WEB_API, entrega PI_WEB_API_WRITE |
| Archivo (directorio) | Recolección FILE_WATCH, entrega FILE_WRITE |
| HTTP | Aplicaciones HTTP que hablan con el mismo servidor — ver Conexión HTTP |
Toda conexión tiene probar conexión en la propia pantalla — úselo antes de crear la Recolección, para separar un problema de red/credencial de un problema de configuración.
Guardar una conexión reinicia las sesiones que dependen de ella. Las Recolecciones y Entregas con sesión persistente — MQTT, Sparkplug, OPC UA, Modbus, SAP IDoc, carpeta observada y los gates de escritura en equipo — se reconectan con los datos nuevos en el momento. Antes, la sesión abierta seguía con la dirección anterior, y una conexión corregida podía seguir “desconectada” hasta que se reiniciara la API.
El tipo de una conexión no cambia después de creada: para otro tipo, registre una conexión nueva. La pantalla siempre bloqueó el campo, y desde la Conexión HTTP el servidor también rechaza el cambio hecho por la API, el MCP o la importación. En una conexión InfluxDB, la versión (1.8, 2.x, 3.x) también queda bloqueada mientras alguna Recolección o Entrega InfluxDB dependa de ella: cada versión habla un lenguaje de consulta y graba por una dirección distinta, y el cambio rompería esas integraciones en la siguiente ejecución. El campo muestra cuántas son.
Conexión HTTP
Cuando varias Aplicaciones hablan con el mismo servidor HTTP, registre el servidor una vez aquí y vincule las Aplicaciones a él. Cambiar la dirección, la URL de Keep Alive o el certificado pasa a hacerse en un solo lugar.
| Campo | Para qué sirve |
|---|---|
| URL base | Dirección del servidor. La ruta de cada integración sigue en la Recolección o en la Entrega |
| URL de Keep Alive | Se prueba en cada ciclo, una vez para todas las Aplicaciones vinculadas. Solo HTTP 200 cuenta como en línea |
| Certificado CA (PEM) | Solo para servidores con CA privada o certificado autofirmado |
- El usuario y la contraseña no se guardan aquí. La Credencial sigue en cada Aplicación, porque Aplicaciones del mismo servidor pueden entrar con usuarios distintos.
- Las Aplicaciones vinculadas quedan ON y OFF juntas. El Keep Alive es del servidor, no de cada una.
- Guardar una conexión en uso pide confirmación. Cuando cambian la URL, el Keep Alive o el certificado, la pantalla lista las Aplicaciones vinculadas antes de grabar: la dirección de todas ellas, y la de sus Entregas HTTP, cambia junta.
- Desactivar la conexión retiene las Entregas de las Aplicaciones vinculadas y las deja OFF, como en los demás tipos.
- Una conexión HTTP en uso no se puede eliminar. Pase antes las Aplicaciones a URL propia o a otra conexión.
Para vincular una Aplicación, elija Conexión Externa en el campo Dirección de su registro. Para crear la conexión a partir de una Aplicación existente, use Convertir en Conexión Externa — ver URL propia o Conexión Externa.
El listado también dice de dónde vino cada conexión: dos columnas muestran quién la creó y quién la modificó por última vez. El autor es siempre quien estaba autenticado en el momento — nunca un campo enviado en el formulario — y queda guardado como e-mail, así que el registro sobrevive a la eliminación de aquel usuario.
La autoría no viaja en el archivo de importación/exportación: quien importa firma el registro en el destino. De lo contrario, una conexión restaurada de un respaldo aparecería sin autor alguno, o con el e-mail de alguien que ni siquiera tiene cuenta en este ambiente. “Creado por” solo se graba en la creación — reimportar por encima no reescribe quién la creó aquí.
Los campos de una conexión también se pueden consultar desde dentro de la Recolección y de la Entrega que la usan, sin pasar por esta pantalla — ver Detalles de la conexión.
Ver catálogo
Las conexiones de base de datos y de archivo ganan un segundo botón: Ver catálogo. Navega por la estructura real — esquemas, tablas, columnas y clave; o carpetas y archivos — sin generar nada.
Vale por sí mismo: después de registrar una base de datos, lo primero que se quiere saber es si esa credencial ve lo que debería. Y desde ahí se abre el asistente que genera la Recolección y la Entrega listas — ver Catálogo de base de datos y Catálogo de carpetas.
Las conexiones de los Simuladores aparecen aquí automáticamente cuando el simulador correspondiente se habilita — “OPC Simulator (interno)”, “Modbus Simulator (interno)” y “PI Simulator (interno)”. No hay dirección que escribir.
Credenciales — /credentials

Autenticación de las llamadas HTTP/SOAP. Se almacenan cifradas en reposo y nunca son reexhibidas por la API.
| Tipo | Cómo funciona |
|---|---|
| Basic Auth | Usuario y contraseña en el header Authorization: Basic |
| API Key | Un valor fijo, en el header o en la query, con el nombre que el destino exija |
| Login → Token | El CMS hace un POST de login, extrae el token de la respuesta y lo usa en las llamadas siguientes |
| OAuth2 client credentials | Flujo máquina a máquina estándar, con renovación automática |
Login → Token cubre las APIs corporativas que inventaron su propio login: el token puede venir
anidado en la respuesta (data.session.token), el cuerpo del login acepta parámetros extra
además de usuario y contraseña, y la contraseña puede ir hasheada antes del envío, cuando es eso
lo que la API espera.
OAuth2 soporta scope, parámetros extra y las dos formas de enviar el client_id /
client_secret: en el header Basic (el preferido por la RFC, estándar de Keycloak y Auth0) o en el
cuerpo del form, exigido por parte de los proveedores. Solo existe client_credentials — el CMS es
máquina a máquina, no tiene navegador para el redirect ni usuario para consentir.
Entrada y salida
La Credencial tiene una dirección:
- Salida — usada por el CMS al llamar a la Aplicación. Es el caso de las cuatro anteriores.
- Entrada — un login y contraseña que una aplicación externa usa para enviar mensajes al CMS, como alternativa al API Token. Tiene usuario responsable e Interfaces permitidas.
Las Credenciales de Entrada tienen también el botón Conectar vía MCP: el mismo login y contraseña autentican a un agente de IA en el Servidor MCP de integraciones de la Aplicación, y el popup muestra la dirección y el fragmento de configuración del cliente, en Basic Auth.
Para una integración REST común, la combinación HTTP_GET/HTTP_POST + Credencial +
Transformador cubre el caso. Los adaptadores nativos existen solo para protocolos que no son
HTTP.
API Tokens — /api-tokens

Tokens que autentican a quien envía mensajes al CMS, emitidos por aplicación. Aceptados como:
- header
x-api-token: <token> - header
Authorization: Bearer <token> - header
Authorization: Basiccon el token en la posición de la contraseña
Cada copia del token se registra en un historial de copias — quién copió y cuándo.
El botón Conectar vía MCP, en la fila de cada clave, muestra cómo usar la misma API Key en un agente de IA: la dirección del Servidor MCP de integraciones de la Aplicación y un ejemplo de configuración del cliente. El valor de la clave no aparece allí — el ejemplo trae un marcador, y el valor real sigue saliendo solo por el Copiar, con registro.
El valor completo sale únicamente por el botón Copiar. El listado muestra la clave enmascarada
(••••1a2b), y crear una clave nueva también devuelve solo la enmascarada — el valor no aparece
en la pantalla de creación. Es lo que garantiza que toda divulgación pase por el historial de
copias: una clave devuelta junto con la respuesta de creación saldría sin ningún registro.
Entregar la credencial a quien va a usarla
Credencial, API Key y token MCP tienen el mismo problema práctico: alguien necesita recibir el secreto para configurar el otro lado, y el camino fácil — copiar de la pantalla y pegarlo en el chat del equipo — es el peor posible. Por eso las tres pantallas tienen el botón Enviar por e-mail.
Qué hace, y por qué así:
| Decisión | Motivo |
|---|---|
| El cuerpo del e-mail se arma en el servidor | El valor descifrado nunca pasa por el navegador de quien apretó el botón |
| El destinatario se elige en una lista de usuarios del CMS, no se escribe | Un campo de dirección libre convertiría el botón en un relay capaz de mandar la contraseña a cualquier lado |
| La lista trae solo a quien es elegible para esa Aplicación | Misma convención de las alertas: administrador siempre, y usuario sin Interfaz restringida es elegible para todo |
| Éxito y fallo van a la auditoría | “Intentó mandar y el SMTP lo rechazó” es información tan relevante como el envío |
| El secreto nunca entra en el detalle del log | El Log de Auditoría lo lee mucha gente |
El e-mail llega con el contexto junto al valor — Aplicación, Aplicación usuaria, dirección, Interfaces permitidas y la dirección de esta instalación — para que quien lo recibe pueda configurar sin tener que volver a preguntar.
Depende del SMTP configurado en Configuraciones › E-mail. Sin él el botón falla de forma explícita, y el fallo también queda registrado.
En el caso del token MCP hay una diferencia: el destinatario no se elige. Es siempre el usuario de servicio dueño del token, porque es su acceso el que la IA va a usar.
Variables — /global-variables y /application-variables

Pares nombre/valor con descripción opcional, reutilizables en las configuraciones. Sirven para no repetir (ni desparramar) valores que cambian por ambiente — URL base, códigos de planta, prefijos.
Son dos pantallas, una por alcance — con Herramientas separadas, así que el permiso de una no da acceso a la otra:
| Pantalla | Ruta | Menú | Alcance |
|---|---|---|---|
| Variables Globales | /global-variables | Configuraciones | Valen en todo el sistema |
| Variables de Aplicación | /application-variables | Config. de Integración | Valen solo en las Recolecciones, Entregas y Transformadores de la Aplicación donde fueron registradas |

Donde se puede usar una variable, ambas aparecen juntas — en el selector {} de los campos de
Recolección y Entrega, en el panel de placeholders del Comando SQL y de la Plantilla de Contenido, y
como global.NOMBRE en el script del Transformador. La variable de la Aplicación tiene
prioridad: si existe una Global con el mismo nombre, se usa el valor de la Aplicación.
Una variable de Aplicación solo se resuelve cuando la configuración pertenece a esa Aplicación. En un Transformador con Alcance en más de una Aplicación, el selector Contexto de la pantalla decide de cuál vienen las variables durante la prueba.
Dónde se usa la variable
Cada fila trae la columna Dónde se usa, con el conteo de referencias y un popup que lista cada
una: la Recolección, la Entrega o el Transformer que la menciona, con la Aplicación, el campo y el
fragmento donde aparece. El barrido cubre tres formas de uso: Template ({{VAR}}), Bind SQL
(:VAR) y Script (global.VAR).
Es lo que se consulta antes de renombrar o eliminar. Eliminar una variable referenciada no da error: las referencias pasan a resolver a vacío, en silencio — y la pantalla lo avisa en la confirmación.
Un Transformer puede armar el nombre de la variable en tiempo de ejecución (global['PLANT_' + uf]).
Usos así no aparecen en la lista, porque solo existen cuando el script corre. El conteo es un
piso, no una garantía.
En las Globales hay además Sobrepuesta en: las Aplicaciones que tienen una Variable de Aplicación con ese mismo nombre. Dentro de ellas el valor global no vale.
Ambos alcances entran juntos en el import/export de la Danger Zone, bajo el mismo ítem Variables (Globales y de Aplicación) — las de Aplicación se referencian por la sigla de la Aplicación, así que importe Aplicaciones junto con ellas.
Las dos pantallas también muestran quién creó y quién modificó por última vez cada variable, con fecha, bajo la misma regla de las Conexiones: el autor es quien estaba autenticado en el momento, guardado como correo electrónico. Una variable creada por import o por Pack, sin nadie conduciendo, aparece con un guion.
Encontrar un registro entre muchos
Estas pantallas, como las demás agrupadas por Aplicación, tienen un campo de búsqueda que filtra por Aplicación, Interfaz y Definición a la vez — y también por lo que identifica al propio registro. En Credenciales y API Keys, eso incluye las dos Aplicaciones involucradas: la dueña y la usuaria.
El mismo campo existe en Errores de Negocio (por el código del error), en Reglas de Cifrado (por el texto comodín), en Alertas (por el login del destinatario) y en Claves de Cifrado.