
En este art铆culo, mostrar茅 c贸mo conectar captcha de Google (reCAPTCHA) a Vue JS y validar la respuesta en el servidor (uso el backend en Laravel / Lumen como ejemplo, pero el principio de validaci贸n es el mismo para todas las tecnolog铆as).
Pr贸logo
Usaremos reCAPTCHA invisible .
Este es un captcha invisible *, que no necesita pasarse hasta que el sistema lo considere necesario. El administrador del sitio puede establecer un nivel de umbral (Preferencia de seguridad) en el que el sistema requerir谩 que el usuario se someta a una verificaci贸n adicional.
* - el 铆cono reCAPTCHA a煤n debe estar presente en la p谩gina.

Captcha invisible en el sitio.
Pregunta / respuesta
Antes de comenzar a trabajar, me gustar铆a responder las preguntas que surgieron cuando comenc茅 a trabajar con Google reCAPTCHA.
P: 驴Cu谩nto cuesta reCAPTCHA?
R: ReCAPTCHA de Google es una herramienta gratuita.
P: 驴Por qu茅 debo verificar la respuesta del usuario en el back-end nuevamente si ya pas贸 el captcha en el sitio?
R: Cuando realiza una solicitud al servidor, env铆a algo como esto:
POST /register 1.1 HTTP Host: www.example.com { "email:"user@gmail.com", "password": "supersecret", "recaptcha-token":"01ASJASJFZ_AASD3115..." }
Si no marca el token captcha en el backend, los bots simplemente pueden enviar spam con solicitudes SIN este token o reemplazarlo por uno ficticio.
P: Tengo una reacci贸n, 驴qu茅 debo hacer?
A: React JS es una gran cosa. Si lo usa para el desarrollo de sitios web, le aconsejo que preste atenci贸n a https://github.com/appleboy/react-recaptcha . El principio de funcionamiento es muy similar al ejemplo con Vue.
Llegar al trabajo
Entonces, antes de comenzar a cocinar, necesitamos una lista de ingredientes:
Paso # 1: Obtenga las claves para usar reCAPTCHA en su sitio
Necesitamos obtener la clave del sitio y la clave secreta en el sitio web de Google: https://www.google.com/recaptcha/admin#list

Puedes escribir cualquier cosa en el campo de etiqueta.
Luego, seleccione el tipo - Insignia invisible reCAPTCHA .
Puede especificar varios dominios en los que usar谩 captcha.
Como ejemplo, he indicado yourawesomedomain.com y localhost .
Aceptamos los t茅rminos de uso y seguimos adelante.

Le han dado dos llaves, gu谩rdelas en un lugar seguro. Volveremos a ellos m谩s tarde.
Para comenzar, necesitamos agregar este c贸digo a la secci贸n principal:
<script src="https://www.google.com/recaptcha/api.js?onload=vueRecaptchaApiLoaded&render=explicit" async defer></script>
La propiedad onload le dir谩 a nuestro componente que el captcha est谩 listo para usar.
A continuaci贸n, mostrar茅 el componente terminado y lo analizaremos en partes:
<template> <div id="app"> <div class="container my-4"> <div class="row justify-content-center"> <div class="col-md-8"> <h2 class="text-center mb-4"> Sign Up Form with Google reCAPTCHA </h2> <form method="post" @submit.prevent="validate"> <div class="form-group"> <input type="email" name="email" class="form-control" placeholder="Enter your e-mail address" required /> </div> <div class="form-group"> <input type="password" name="password" class="form-control" placeholder="Enter your password" required /> </div> <div class="form-group"> <vue-recaptcha ref="recaptcha" size="invisible" :sitekey="sitekey" @verify="register" @expired="onCaptchaExpired" /> <button type="submit" class="btn btn-primary btn-block"> Sign Up </button> </div> </form> </div> </div> </div> </div> </template> <script> import VueRecaptcha from 'vue-recaptcha' export default { name: 'Register', components: { VueRecaptcha }, data () { return { email: null, password: null, sitekey: ' SITE KEY' } }, methods: { register (recaptchaToken) { axios.post('https://yourserverurl.com/register', { email: this.email, password: this.password, recaptchaToken: recaptchaToken }) }, validate () { </script>
Ejemplo de componente usando VeeValidate para validar campos <template> <div id="app"> <div class="container my-4"> <div class="row justify-content-center"> <div class="col-md-8"> <h2 class="text-center mb-4"> Sign Up Form with Google reCAPTCHA </h2> <form method="post" @submit.prevent="validate"> <div class="form-group"> <input type="email" name="email" class="form-control" placeholder="Enter your e-mail address" v-validate.disable="'required|email'" required /> <div v-show="errors.has('email')" class="invalid-feedback d-block" > {{ errors.first('email') }} </div> </div> <div class="form-group"> <input type="password" name="password" class="form-control" placeholder="Enter your password" v-validate.disable="'required|min:6|max:32'" required /> <div v-show="errors.has('password')" class="invalid-feedback d-block" > {{ errors.first('password') }} </div> </div> <div class="form-group"> <vue-recaptcha ref="recaptcha" size="invisible" :sitekey="sitekey" @verify="register" @expired="onCaptchaExpired" /> <button type="submit" class="btn btn-primary btn-block"> Sign Up </button> </div> </form> </div> </div> </div> </div> </template> <script> import VueRecaptcha from 'vue-recaptcha' export default { name: 'Register', components: { VueRecaptcha }, data () { return { email: null, password: null, sitekey: ' SITE KEY' } }, methods: { register (recaptchaToken) { axios.post('https://yourserverurl.com/register', { email: this.email, password: this.password, recaptchaToken: recaptchaToken }) }, validate () { const self = this self.$validator.validateAll().then((result) => { if (result) { self.$refs.recaptcha.execute() } }) }, onCaptchaExpired () { this.$refs.recaptcha.reset() } } } </script>
Para empezar, importamos Vue-Recaptcha en nuestro componente:
import VueRecaptcha from 'vue-recaptcha' ... components: { VueRecaptcha },
A continuaci贸n, declaramos la propiedad sitekey en el componente data ():
data () { return { ... sitekey: ' SITE KEY' } },
Agregue el componente Vue-Recaptcha a nuestro formulario:
<vue-recaptcha ref="recaptcha" size="invisible" :sitekey="sitekey" @verify="register" @expired="onCaptchaExpired" />
Se llamar谩 al m茅todo de registro al completar con 茅xito el captcha, mientras que caducado se llamar谩 al vencimiento del captcha.
El m茅todo onCaptchaExpired reinicia el captcha:
onCaptchaExpired () { this.$refs.recaptcha.reset() }
En el formulario en s铆, agregamos el evento @ submit.prevent = "validate" , que activa el m茅todo de validaci贸n cuando se env铆a el formulario.
validate () { this.$refs.recaptcha.execute() }
El proceso se puede describir de la siguiente manera:
- El usuario ingres贸 los datos y hizo clic en el bot贸n Registrarse, se llama a la funci贸n validate ().
- La funci贸n validate () inicia captcha, si el usuario la pasa con 茅xito, se llama al m茅todo de registro.
En el m茅todo de registro, obtenemos un recaptchaToken , que debemos enviar al servidor junto con los datos que ingres贸 el usuario:
register (recaptchaToken) { axios.post('https://yourserverurl.com/register', { email: this.email, password: this.password, recaptchaToken: recaptchaToken }) }
En esto se completa nuestro trabajo con el front-end. ReCAPTCHA se instal贸 y ejecut贸 correctamente.
PD: Si va a utilizar captcha en varios componentes, es mejor colocar la clave de sitio en el archivo .env y obtenerlo usando process.env :
data () { return { ... sitekey: process.env.VUE_APP_RECAPTCHA_TOKEN } },
Paso # 3: validaci贸n del backend. Ejemplo de validaci贸n en Laravel y Lumen
Hacer la validaci贸n de la respuesta en el servidor es muy simple. Comencemos con el ejemplo de Laravel.
1) En la carpeta de configuraci贸n , cree un archivo recaptcha.php con el siguiente contenido:
<?php return [ 'enabled' => env('RECAPTCHA_ENABLED', true), 'key' => env('RECAPTCHA_SITE_KEY'), 'secret' => env('RECAPTCHA_SECRET_KEY'), ];
2) Despu茅s de eso, agregue las variables al archivo .env :
RECAPTCHA_ENABLED=FALSE RECAPTCHA_SITE_KEY=_SITE_KEY RECAPTCHA_SECRET_KEY=_SECRET_KEY
3) Instale GuzzleHttp para poder enviar solicitudes de API de Google:
composer require guzzlehttp/guzzle
4) En el controlador, agregue el m茅todo checkRecaptcha :
protected function checkRecaptcha($token, $ip) { $response = (new Client)->post('https://www.google.com/recaptcha/api/siteverify', [ 'form_params' => [ 'secret' => config('recaptcha.secret'), 'response' => $token, 'remoteip' => $ip, ], ]); $response = json_decode((string)$response->getBody(), true); return $response['success']; }
En este m茅todo, enviamos nuestro token (que recibimos de la interfaz) usando el m茅todo POST para https://www.google.com/recaptcha/api/siteverify
5) En el m茅todo de registro (en su caso, el nombre puede diferir, este es el m茅todo al que envi贸 la solicitud POST desde la interfaz) agregue el siguiente c贸digo:
if (config('recaptcha.enabled') && !$this->checkRecaptcha($request->recaptcha_token, $request->ip())) { return return response()->json([ 'error' => 'Captcha is invalid.', ], Response::HTTP_BAD_REQUEST); }
隆Todo est谩 listo para usar!
- Al acceder al m茅todo de registro, recibimos correo electr贸nico, contrase帽a y recaptcha_token.
- Si recaptcha est谩 habilitado (en el archivo .env, el valor RECAPTCHA_ENABLED es TRUE),
Laravel enviar谩 una solicitud de API de Google. - Si la respuesta es no, devolvemos un error con el texto: Captcha no es v谩lido.
- Si es positivo, contin煤e el registro del usuario.

Token Travel Presentaci贸n visual
El c贸digo del controlador completo se ver谩 as铆:
<?php namespace App\Http\Controllers\Users; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Http\Response; use GuzzleHttp\Client; class UserController extends Controller { protected function checkRecaptcha($token, $ip) { $response = (new Client)->post('https://www.google.com/recaptcha/api/siteverify', [ 'form_params' => [ 'secret' => config('recaptcha.secret'), 'response' => $token, 'remoteip' => $ip, ], ]); $response = json_decode((string)$response->getBody(), true); return $response['success']; } public function register(Request $request) { $request->validate([ 'email' => 'required|string|email|unique:users|max:255', 'password' => 'required|string|max:32|min:6', 'recaptcha_token' => 'string' ]); if (config('recaptcha.enabled') && !$this->checkRecaptcha($request->recaptcha_token, $request->ip())) { return response()->json([ 'error' => 'Captcha is invalid.', ], Response::HTTP_BAD_REQUEST); }
Validaci贸n de la respuesta a Lumen
En Lumen, hacemos todo de la misma manera que en el ejemplo con Laravel, excepto que necesitamos registrar nuestra configuraci贸n ( recaptcha.php ) en bootstrap / app.php :
$app->configure('recaptcha');
Conclusi贸n
Entonces, en este art铆culo, aprendiste a usar Google reCAPTCHA en tu proyecto Vue.
ReCAPTCHA es una gran herramienta gratuita para proteger su recurso de los bots.
Con el captcha invisible puedes revisar a los visitantes sin requerir que tomen ninguna acci贸n.
Ejemplo de aplicaci贸n de un art铆culo sobre codepen
Fuentes utilizadas:
- https://github.com/DanSnow/vue-recaptcha
- https://developers.google.com/recaptcha/docs/invisible
- https://developers.google.com/recaptcha/docs/verify
- https://security.stackexchange.com/questions/78807/how-does-googles-no-captcha-recaptcha-work