Files
roi-theme/Schemas/recaptcha-settings.json
FrankZamora d135ec8a41 feat(api): implement recaptcha v3 anti-spam protection
- Add RecaptchaValidatorInterface and RecaptchaResult entity in Domain
- Create RecaptchaValidationService in Application layer
- Implement GoogleRecaptchaValidator for API integration
- Add recaptcha-settings schema and admin FormBuilder
- Integrate reCAPTCHA validation in NewsletterAjaxHandler
- Integrate reCAPTCHA validation in ContactFormAjaxHandler
- Update FooterRenderer and ContactFormRenderer with reCAPTCHA scripts
- Configure DIContainer with RecaptchaValidationService injection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 17:01:46 -06:00

91 lines
2.6 KiB
JSON

{
"component_name": "recaptcha-settings",
"version": "1.0.0",
"description": "Configuracion de Google reCAPTCHA v3 para proteccion anti-spam",
"groups": [
{
"name": "visibility",
"label": "Visibilidad",
"priority": 10,
"fields": [
{
"name": "is_enabled",
"label": "Habilitar reCAPTCHA",
"type": "boolean",
"default": false,
"description": "Activa la proteccion reCAPTCHA v3 en los formularios"
}
]
},
{
"name": "credentials",
"label": "Credenciales",
"priority": 20,
"fields": [
{
"name": "site_key",
"label": "Site Key",
"type": "text",
"default": "",
"description": "Clave publica de reCAPTCHA v3 (visible en frontend)"
},
{
"name": "secret_key",
"label": "Secret Key",
"type": "text",
"default": "",
"description": "Clave secreta de reCAPTCHA v3 (solo backend, nunca exponer)"
}
]
},
{
"name": "behavior",
"label": "Comportamiento",
"priority": 70,
"fields": [
{
"name": "score_threshold",
"label": "Umbral de Score",
"type": "select",
"default": "0.5",
"options": [
{"value": "0.3", "label": "0.3 - Permisivo (menos bloqueos)"},
{"value": "0.5", "label": "0.5 - Balanceado (recomendado)"},
{"value": "0.7", "label": "0.7 - Estricto"},
{"value": "0.9", "label": "0.9 - Muy estricto (mas bloqueos)"}
],
"description": "Score minimo para considerar humano (0.0=bot, 1.0=humano)"
},
{
"name": "action_newsletter",
"label": "Accion Newsletter",
"type": "text",
"default": "newsletter_submit",
"description": "Nombre de accion para formulario newsletter"
},
{
"name": "action_contact",
"label": "Accion Contacto",
"type": "text",
"default": "contact_submit",
"description": "Nombre de accion para formulario de contacto"
},
{
"name": "fail_open",
"label": "Permitir en caso de fallo",
"type": "boolean",
"default": true,
"description": "Si la API de Google falla, permitir el envio (fail-open)"
},
{
"name": "log_blocked",
"label": "Registrar intentos bloqueados",
"type": "boolean",
"default": true,
"description": "Guardar log de intentos bloqueados por bajo score"
}
]
}
]
}