Ir al contenido

Configuración

Esta página documenta los parámetros necesarios para ejecutar IZ-CentralForms, consumir la API pública, configurar secretos y preparar ambientes superiores.

El proyecto se encuentra actualmente en ambiente local de desarrollo. La configuración productiva debe definirse por ambiente y no debe versionar secretos reales.

ConfiguraciónValor
AmbienteDevelopment
API local HTTPhttp://localhost:5273
API local HTTPShttps://localhost:7122
Base de datos(localdb)\MSSQLLocalDB
DatabaseCentralFormsDb
SwaggerHabilitado en desarrollo
SMTP locallocalhost:1025
Mailpit UIhttp://localhost:8025
SDK JS/sdk/centralforms.js
Ejemplo SDK/examples/contacto.html
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=CentralFormsDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
{
"ConnectionStrings": {
"DefaultConnection": "Server=SERVIDOR_SQL;Database=CentralFormsDb;User Id=centralforms_user;Password=PASSWORD_SEGURO;TrustServerCertificate=True;MultipleActiveResultSets=true"
}
}
{
"ConnectionStrings": {
"DefaultConnection": "Server=.\\SQLEXPRESS;Database=CentralFormsDb;Trusted_Connection=True;TrustServerCertificate=True;MultipleActiveResultSets=true"
}
}
{
"Email": {
"Host": "localhost",
"Port": 1025,
"EnableSsl": false,
"UserName": "",
"Password": "",
"FromEmail": "no-reply@centralforms.local",
"FromName": "CentralForms Dev"
}
}
{
"Email": {
"Host": "sandbox.smtp.mailtrap.io",
"Port": 2525,
"EnableSsl": true,
"UserName": "USUARIO_SMTP",
"Password": "PASSWORD_SMTP",
"FromEmail": "no-reply@interzone.net",
"FromName": "CentralForms"
}
}
CampoTipoRequeridoDescripción
HoststringServidor SMTP.
PortintegerPuerto SMTP.
EnableSslbooleanDefine si la conexión SMTP usa SSL/TLS.
UserNamestringSegún proveedorUsuario SMTP.
PasswordstringSegún proveedorPassword SMTP.
FromEmailstringCorreo remitente.
FromNamestringNombre visible del remitente.

Para ambientes compartidos o reales, evitar credenciales dentro de appsettings.json. ASP.NET Core permite sobrescribir configuración con User Secrets en desarrollo o variables de entorno en servidor.

Ventana de terminal
cd CentralForms.Api
dotnet user-secrets init
dotnet user-secrets set "Email:Host" "sandbox.smtp.mailtrap.io"
dotnet user-secrets set "Email:Port" "2525"
dotnet user-secrets set "Email:EnableSsl" "true"
dotnet user-secrets set "Email:UserName" "USUARIO_SMTP"
dotnet user-secrets set "Email:Password" "PASSWORD_SMTP"
dotnet user-secrets set "Email:FromEmail" "no-reply@centralforms.local"
dotnet user-secrets set "Email:FromName" "CentralForms Dev"
ASPNETCORE_ENVIRONMENT=Production
ConnectionStrings__DefaultConnection=Server=SERVIDOR_SQL;Database=CentralFormsDb;User Id=USUARIO_SQL;Password=PASSWORD_SQL;TrustServerCertificate=True;MultipleActiveResultSets=true
Admin__ApiKeyHash=HASH_SHA256_DE_LA_ADMIN_KEY
Email__Host=smtp.proveedor.com
Email__Port=587
Email__EnableSsl=true
Email__UserName=USUARIO_SMTP
Email__Password=PASSWORD_SMTP
Email__FromEmail=no-reply@interzone.net
Email__FromName=CentralForms
Swagger__Enabled=false
Seed__DemoData=false

Los endpoints administrativos usan el header:

X-Admin-Key: <admin_key>

La configuración debe almacenar el hash, no la clave real:

{
"Admin": {
"ApiKeyHash": "HASH_SHA256_DE_LA_ADMIN_KEY"
}
}
Ventana de terminal
$key = "tu-api-key-real"
$bytes = [System.Text.Encoding]::UTF8.GetBytes($key)
$hash = [System.Security.Cryptography.SHA256]::HashData($bytes)
[System.BitConverter]::ToString($hash).Replace("-", "").ToLowerInvariant()

Obtiene la definición del formulario y genera un token CSRF para usarlo en el POST.

GET /api/forms/{consumerCode}/{formCode}
CampoUbicaciónTipoRequeridoDescripción
consumerCodepathstringCódigo único del consumer.
formCodepathstringCódigo único del formulario.
X-Api-KeyheaderstringAPI Key pública del consumer.
OriginheaderstringCondicionalOrigin enviado por navegador; se valida contra AllowedOrigins cuando viene informado.
GET /api/forms/demo/contacto HTTP/1.1
Host: localhost:7122
X-Api-Key: demo-api-key
Origin: https://localhost:7122
CampoTipoDescripción
consumerCodestringCódigo del consumer.
formCodestringCódigo del formulario.
titlestringTítulo del formulario.
descriptionstring/nullDescripción del formulario.
csrfTokenstringToken CSRF stateful requerido para el POST.
fieldsarrayLista de campos dinámicos del formulario.
fields[].namestringNombre técnico del campo.
fields[].labelstringTexto visible del campo.
fields[].typestringTipo de campo, por ejemplo text, email, textarea, select.
fields[].requiredbooleanIndica si el campo es obligatorio.
fields[].orderintegerOrden de renderizado.
fields[].placeholderstring/nullPlaceholder del campo.
fields[].optionsarray/nullOpciones disponibles para campos tipo lista.
{
"consumerCode": "demo",
"formCode": "contacto",
"title": "Formulario de Contacto",
"description": "Escríbenos y te responderemos a la brevedad.",
"csrfToken": "csrf_token_generado",
"fields": [
{
"name": "nombre",
"label": "Nombre completo",
"type": "text",
"required": true,
"order": 1,
"placeholder": "Ingrese su nombre",
"options": null
}
]
}

Procesa el envío de un formulario. Si la validación es correcta, persiste la submission antes de ejecutar email o webhook.

POST /api/forms/{consumerCode}/{formCode}/submit
CampoUbicaciónTipoRequeridoDescripción
consumerCodepathstringCódigo único del consumer.
formCodepathstringCódigo único del formulario.
X-Api-KeyheaderstringAPI Key pública del consumer.
X-CSRF-TokenheaderstringToken generado en el GET del formulario.
OriginheaderstringCondicionalOrigin enviado por navegador; debe estar autorizado cuando viene informado.
Content-TypeheaderstringDebe ser application/json.
databodyobjectObjeto con los valores enviados por el formulario.
POST /api/forms/demo/contacto/submit HTTP/1.1
Host: localhost:7122
X-Api-Key: demo-api-key
X-CSRF-Token: TOKEN_DEL_GET
Origin: https://localhost:7122
Content-Type: application/json
{
"data": {
"nombre": "María González",
"email": "maria@dominio.com",
"servicio": "Consultoría",
"mensaje": "Quisiera información sobre precios."
}
}
CampoTipoDescripción
successbooleanIndica si el submit fue aceptado.
messagestringMensaje funcional para el consumidor.
submissionIdguidIdentificador de la submission persistida.
{
"success": true,
"message": "Formulario enviado correctamente",
"submissionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
{
"success": false,
"message": "Campos requeridos faltantes",
"missingFields": ["nombre", "email"]
}
CódigoGET formularioPOST submission
200 OKFormulario retornado correctamente.Submission validada y persistida.
400 Bad RequestNo aplica normalmente.Campos inválidos o requeridos faltantes.
401 UnauthorizedAPI Key inválida, ausente o consumer inactivo.API Key inválida, ausente o consumer inactivo.
403 ForbiddenOrigin no autorizado si el header fue informado.Origin no autorizado o CSRF inválido.
404 Not FoundConsumer o formulario no existe.Consumer o formulario no existe.
429 Too Many RequestsNo aplica normalmente.Rate limit superado.
500 Internal Server ErrorError interno.Error al persistir o procesar.

CentralForms usa FormDestinations para ejecutar acciones después de persistir una submission.

TipoUsoValor esperado
emailEnviar notificación por correo.Uno o más destinatarios.
webhookEnviar submission a sistema externo.URL destino.
INSERT INTO FormDestinations (Id, FormId, [Type], [Value], IsActive)
VALUES (
NEWID(),
@FormId,
'email',
'destinatario@dominio.com',
1
);

Value puede contener varios destinatarios separados por coma o punto y coma.

INSERT INTO FormDestinations (Id, FormId, [Type], [Value], IsActive)
VALUES (
NEWID(),
@FormId,
'webhook',
'https://webhook.site/TU-URL-AQUI',
1
);

Uso básico:

<div id="centralforms-contacto"></div>
<script src="https://localhost:7122/sdk/centralforms.js"></script>
<script>
CentralForms.render({
container: '#centralforms-contacto',
apiBaseUrl: 'https://localhost:7122',
consumerCode: 'demo',
formCode: 'contacto',
apiKey: 'demo-api-key',
submitLabel: 'Enviar mensaje'
});
</script>
OpciónTipoDefaultRequeridoDescripción
containerstring/HTMLElementContenedor donde se renderiza el formulario.
apiBaseUrlstringwindow.location.originURL base de CentralForms API.
consumerCodestringCódigo del consumer.
formCodestringCódigo del formulario.
apiKeystringAPI Key enviada en X-Api-Key.
submitLabelstringEnviarNoTexto normal del botón.
submittingLabelstringEnviando...NoTexto durante el envío.
successMessagestringFormulario enviado correctamente.NoMensaje después de un POST exitoso.
errorMessagestringNo se pudo enviar el formulario.NoMensaje ante error HTTP o de red.
resetOnSuccessbooleantrueNoLimpia el formulario después de enviar.
refreshTokenOnSuccessbooleantrueNoSolicita nuevo CSRF después de un envío exitoso.
themeColorstring#111827NoColor principal del botón y foco.
disableDefaultStylesbooleanfalseNoDesactiva CSS inyectado por el SDK.
ConfiguraciónLocalQA / StagingProducción
Connection stringLocalDBSQL Server realSQL Server real
SwaggerHabilitadoHabilitado o restringidoRestringido o deshabilitado
Seed demoActivoSolo si aplicaDesactivado
SMTPMailpit / MailtrapMailtrap o SMTP realSMTP real
API KeysDemo/localSecret seguroSecret seguro
Admin KeyDemo/localSecret seguroSecret seguro
OriginsLocalhostDominios QADominios producción

Antes de cambiar de ambiente validar:

  • Connection string correcta.
  • Base de datos creada y migrada.
  • SMTP configurado.
  • API Key y Admin Key configuradas como hash.
  • Origins permitidos cargados.
  • Swagger restringido según ambiente.
  • Seed demo desactivado en producción.
  • HTTPS habilitado fuera de local.