Cloudflare Turnstile
Cloudflare Turnstile es una alternativa inteligente de CAPTCHA proporcionado por Cloudflare que se utiliza para proteger formularios en sitios web contra ataques automatizados, como bots maliciosos o intentos de spam. Para utilizar este servicio es necesario crear una cuenta de usuario y añadir nuestro sitio web al apartado de Turnstile.
https://www.cloudflare.com/es-es/products/turnstile/
Turnstile
En el apartado de menú Turnstile, debemos de agregar el dominio (puede ser más de uno) de nuestro proyecto. Basta con añadirle un nombre y la url de la app. Las siguientes opciones las dejamos como siguen:
Una vez añadida nuestra app, Cloudflare nos genera un Site Key (una clave que identifica unívocamente nuestro/s dominio/s ) y una Secret key (la clave privada para validar el token referido a nuestro dominio).
Gitlab
Por seguridad, las variables no deben hardcodearse en el código, por ello una vez generadas en Cloudflare, las metemos en gitlab para poder utilizarlas en nuestro proyecto.
Setting -> ci/cd ->variables
- TURNSTILE_SECRET_KEY
- TURNSTILE_SITE_KEY
No olvidar que tiene que haber una por cada entorno y que hay que meter las variables genéricas a la LISTA_SECRET
Una vez creadas, ya podemos meterlas en los filtros del proyecto para utilizarlas. La URL de validación, al ser única y pública podemos meterla directamente hardcodeada en los filtros.
Parte del cliente
Usamos la renderización implícita: el widget Turnstile se inicializa automáticamente escaneando el HTML de la página en busca de elementos con la clase cf-turnstile.
El campo cf-turnstile-response contendrá la información necesaria para que el servidor realice esta verificación.
Los pasos básicos a seguir son:
- Añadimos la librería de cloudflare turnstile (Si utilizamos una plantilla, hay que meterlo en el head)
- Añadimos el div del captcha: tiene que tener la clase “cf-turnstile” y el atributo data-sitekey con el site-key que representa nuestro dominio.
- Añadimos un h:input oculto (type=hidden) con el nombre “cf-turnstile response”. Le asignamos un value del manejador para recoger el valor del token.
- Definimos una función javascript que renderiza nuestro div del captcha y asigna el valor del token de respuesta a la variable de nuestro manejador.
Con esto, el captcha queda implementado en el cliente y el token generado, a la espera de la validación en la parte del servidor
Parte del servidor
El captcha ya está puesto en el cliente con el token generado, ahora hay que validarlo frente a la URL de validación ofrecida por Cloudflare.
Los parámetros requeridos en la solicitud de validación son:
- Secret (site secret key)
- Response (token)
La API acepta solicitudes/x-www-form-urlencoded y aplicaciones/json, pero el tipo de respuesta siempre será aplicación/json.
La respuesta, siempre contiene una propiedad “success”, ya sea verdadera o falsa, indicando si la operación fue exitosa o no (Es la que utilizamos para comprobar que el token es válido)
La documentación de cloudflare turnstile está disponible en javascript modular, pero para implementarlo en java nosotros utilizamos la librería Jersey. Los pasos básicos a seguir son:
- Configuración del cliente HTTP:
- Se crea una instancia de
ClientConfigpara configurar el cliente HTTP. - Se habilita el mapeo POJO para JSON en la configuración.
- Se crea una instancia de
- Creación del cliente HTTP:
- Se instancia un objeto
Clientutilizando la configuración previamente definida.
- Se instancia un objeto
- Creación del recurso web:
- Se crea un objeto
WebResourceapuntando a la URL proporcionada en${turnstile.url}.
- Se crea un objeto
- Preparación de la solicitud:
- Se crea un objeto
CaptchaRequestque contiene los datos necesarios para la validación del token de captcha. - El token recibido como parámetro se establece en el objeto
CaptchaRequest. - Se proporciona un secreto en el objeto
CaptchaRequestobtenido de${TURNSTILE_SECRET_KEY}.
- Se crea un objeto
- Realización de la solicitud HTTP POST:
- Se envía una solicitud HTTP POST al servicio web utilizando el objeto
webResource. - Se configura la solicitud para enviar y recibir datos en formato JSON.
- Se envía una solicitud HTTP POST al servicio web utilizando el objeto
Si la respuesta no es nula y todo ha ido bien (200 OK), entonces se deserializa el cuerpo de la respuesta JSON en un objeto CaptchaResponse y devolvemos la propiedad success.
Resumen final con esquema general
Configuración de las contraseñas







