- 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>
91 lines
2.6 KiB
JSON
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"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|