Hoy vamos a aprender cómo podemos validar un formulario, incluyendo un reCAPTCHA para evitar ataques de spam por BOTS.
Lo primero que tenemos que hacer es registrar nuestro código de reCAPTCHA en Google: https://www.google.com/recaptcha/about/
Y pulsamos en v3 Admin Console
Le damos a crear una nueva en el botón del más (+) y en este caso vamos a elegir V2 invisible:
Google tiene una técnica para verificar captcha de forma invisible utilizando los movimientos de ratón.
Añadimos los dominios o dominio dónde funcionará el recaptcha.
Una vez registrado copiamos la clave y la pegamos en un archivo llamado GoogleUtils.tsx
export const GoogleReCaptchaSiteKey = "fsadfasdcdsafretrefrewf"
*Pon tu clave.
Ahora instalamos la librería que utilizaremos para generar este recaptcha, react-google-recaptcha
npm install --save react-google-recaptcha
Y si usamos TypeScript añadimos
npm i --save-dev @types/react-google-recaptcha
Ahora creamos un componente llamado Captcha.tsx
import React from 'react'; import ReCAPTCHA from "react-google-recaptcha"; import { GoogleReCaptchaSiteKey } from '@/util/BaseURL'; interface Props { captchaRef: any; onChange?: (token: string | null) => void; } function Captcha({ captchaRef, onChange }: Props) { return ( <ReCAPTCHA sitekey={GoogleReCaptchaSiteKey} size="invisible" ref={captchaRef} onChange={onChange} /> ); } export default Captcha;
Y lo llamamos de la siguiente forma:
- Creamos los métodos necesarios para ejecutar:
const captchaRef = useRef<any>(null); const [tokenCaptcha, setTokenCaptcha] = useState<string | null>(null); //Para iniciar sesion useEffect(() => { alert('TOKEN Captcha: ' + tokenCaptcha); //iniciarSesion(); }, [tokenCaptcha]) function comprobarCaptcha() { captchaRef.current.execute(); }
- Añadimos el captcha al formulario:
<CaptchaRecaptcha captchaRef={captchaRef} onChange={(token) => { setTokenCaptcha(token) }} />
Y en el botón añadimos la funcion de comprobarCaptcha en vez de enviar formulario:
<Boton startIcon={<Login />} fullWidth texto={t("contenido:login.iniciar_sesion")} onClick={comprobarCaptcha} />
Si usamos un form con submit hacemos esto:
<form onSubmit={() => { comprobarCaptcha() }}>
Otra forma de obtener el token es de forma asíncrona, este método lo recomiendo, para ello:
const captchaRef = useRef<any>(null); //Con esta línea podemos lanzar el captcha y obtendremos un promise con el valor del token const tokenReCaptha = await captchaRef.current.executeAsync(); //después se reincia para que pueda estar disponible de nuevo captchaRef.current.reset();
Este método podemos añadirlo en nuestra función de login o registro y permitirá lanzar el captcha una vez invocada. Esperará a que se resuelva y devolverá una promesa con el valor del token.
Recuerda que solo se puede probar en la URL que has indicado en los pasos anteriores, en local no va a validar. Puede tardar unas horas en funcionar, ya que Google verifica la URL.
Y ahora solo nos quedaría enviar el token generado del catpcha al servidor y validarlo.
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.