Instalacion de hCaptcha en Angular con validacion backend.

Como ya sabreis, es imprescindible tener en los formularios publicos un sistema para reducir spam, usuarios falsos y abuso automatizado. Google reCAPTCHA, hCaptcha y Cloudflare Turnstile resuelven un problema parecido, pero con diferencias en privacidad, friccion para el usuario, ecosistema del proveedor y validacion backend.

Esta guia conserva el ejemplo original con hCaptcha, pero la lectura actual debe ser mas amplia: elige el proveedor antibot segun el riesgo del formulario, los requisitos de privacidad y el backend que puedas mantener.

En este articulo vamos a enseñar a instalar hCaptcha paso a paso en un proyecto Angular y a mantener la parte segura de la decision en el backend.

hCaptcha, reCAPTCHA y Turnstile

Estas herramientas resuelven un problema parecido, pero no tienen los mismos compromisos. Google reCAPTCHA es conocido y esta muy documentado, hCaptcha se posiciona como alternativa con otro enfoque de privacidad e infraestructura, y Cloudflare Turnstile intenta reducir los retos visibles usando senales del navegador y de riesgo. En todos los casos, el patron seguro es el mismo: Angular recibe un token, pero el backend debe verificarlo antes de confiar en la peticion.

En una app Angular con SSR, el widget debe renderizarse solo en navegador. El HTML generado en servidor puede conservar el contenido del tutorial, pero el script del captcha y el componente dependiente de navegador deben retrasarse hasta la hidratacion.

La verificacion de hCaptcha debe seguir la misma regla de produccion que reCAPTCHA y Turnstile: Angular envia el token de respuesta a tu backend, y el backend lo valida con el endpoint siteverify de hCaptcha antes de procesar el formulario. No expongas la clave secreta en Angular, ni siquiera en ejemplos.

Os dejo el repositorio https://github.com/al118345/ejemplo-hcaptcha-en-angular-universal para su consulta y el siguiente video explicativo:

Por que evaluar hCaptcha

La siguiente lista resume motivos habituales para evaluar hCaptcha en lugar de usar reCAPTCHA por defecto.
  • Independencia de proveedor: es una alternativa cuando no quieres depender solo de Google reCAPTCHA.
  • Enfoque de privacidad: suele evaluarse en proyectos que buscan otro perfil de privacidad.
  • Verificacion backend: como cualquier captcha, el resultado debe verificarse en servidor antes de confiar en el envio de un formulario.
Símbolo de hCaptcha

Alta en hCaptcha.

En este articulo partimos con la premisa de que posees una cuenta de Gmail.

El primer paso es darse de alta en la url https://hCaptcha.com/?r=335d4419fb51. Una vez accedamos y estemos logueados en la cuenta de Gmail aparecerá la siguiente vista.

Pantalla inicial de hCaptcha

O desde la vista de sitios

Creación de nuevo sitio en hCaptcha

Una vez hemos accedido, debemos rellenar el formulario con el dominio dónde lo vamos a ejecutar. A continuación os dejo el ejemplo que hemos aplicado para la web 1938.com.es
Configuración de sitio en hCaptcha
Rellenado el formulario aparecerá la siguiente pantalla con la información acerca de la clave para utilizar el servicio.

Resultado de creación de sitio en hCaptcha

Si presionamos encima de configuraciones podremos consultar la clave publica para utilizarla en nuestro proyecto. Presionar este botón nos llevará a la siguiente pestaña:

Clave pública de hCaptcha

También necesitamos la clave privada, es decir, debemos acceder a la pestaña de configuración para obtenerla cómo se muestra a continuación.

Configuración de hCaptcha
Por último, la clave privada en la pestaña de configuración
Clave secreta de hCaptcha

Importante: Para las pruebas en localhost tenemos la posibilidad de usar:
  • Site Key: 10000000-ffff-ffff-ffff-000000000001
  • Secret Key: 0x0000000000000000000000000000000000000000

Instalación

Para realizar esta instalación, hay que dividir el proyecto entre un front-end y un back-end. El front realizará la interacción con el usuario y el backend se comunicará con hCaptcha.

Desde Angular realizaremos la instalación del paquete ng-hcaptcha con el siguiente comando:

Además crearemos el siguiente servicio para comunicarse con la api de Python.

Importamos el módulo a nuestra app con el siguiente código:
Y añadiremos la funcionalidad en el componente.html:
Y en el componente.ts:

Por último, modificamos la api para recibir la petición del front-end creando la siguiente ruta en el proyecto https://github.com/al118345/envio_email_api_python
Para terminar, en la web https://dashboard.hcaptcha.com/overview puedes consultar una vista como la siguiente imagen dónde puedes comprobar la cantidad de ingresos que has obtenido
Panel de ingresos de hCaptcha

Ejemplo en ejecución

¿Eres un robot?. Según recaptcha de hCaptcha:

Eres un robot, resuelve el Captcha

Para Angular Universal

En el caso de querer realizar una instalacion en una aplicacion Angular con SSR, anadid una pequena comprobacion para evitar problemas de renderización en el servidor.

En proyectos Angular Universal antiguos este comando era habitual. En proyectos Angular actuales, preferid la configuracion oficial con @angular/ssr:

ng add @nguniversal/express-engine

Si os da un error tipo

ERESOLVE unable to resolve dependency tree

No os preocupéis, toca jugar entre este comando

npm install --force @nguniversal/express-engine

Y posteriormente

ng add @nguniversal/express-engine

Estos dos últimos pasos los tenéis que aplicar tantas cómo sea necesario hasta que no aparezca un error.

Primero os comparto el código del component.ts dónde se añade el código necesario para interpretar si se reproduce en la parte del servidor o del navegador.

Puede ser que os aparezca un error en la linea 2 @Inject(PLATFORM_ID) private platformId tal que así:

TS7006: Parameter 'platformId' implicitly has an 'any' type.

En ese caso, añadid al fichero tsconfig.json la siguiente línea

Y ahora se añade el código necesario en la vista (component.html) para evitar el problema del renderizado en el servidor.