
reCAPTCHA е услуга на Гугъл, която позволява проверка при попълване на форми дали попълващият е "човек".
Новата версия 3 има по-различен механизъм от старите версии и за да го интегрираме в Ларавел трябва да имаме инсталирани curl и json като пхп екстеншъни.
Първо регистрираме нов сайт за рекапча в https://www.google.com/recaptcha/admin/create
Може да ползвате както реални, така и фейк адреси на домейни.
Добавяте в .env
файла следните промениви:
GOOGLE_RECAPTCHA_KEY=6Lc..........
GOOGLE_RECAPTCHA_SECRET=6L......
После създаваме rule за да може да ползваме проверката във всяка форма, която искаме чрез вграденият в Ларавел метод validate:
php artisan make:rule Recaptcha
Това създава класа app\Rules\Recaptcha.php
където променяме функцията passes:
public function passes($attribute, $value)
{
$data = array(
'secret' => env('GOOGLE_RECAPTCHA_SECRET'),
'response' => $value
);
try {
$verify = curl_init();
curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($verify, CURLOPT_POST, true);
curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($verify);
return json_decode($response)->success;
} catch (\Exception $e) {
return false;
}
}
Сега вече може да ползвате в блейд файла (примера е за логин форма):
Във формата за логване трябва да дадете id на формата:
<form method="POST" action="{{ route('login') }}" id="login-form">
На мястото на бутона за логин:
<script src="https://www.google.com/recaptcha/api.js"></script>
<script>
function onSubmit(token) {
document.getElementById("login-form").submit();
}
</script>
<button class="g-recaptcha btn btn-primary"
data-sitekey="{{ env('GOOGLE_RECAPTCHA_KEY') }}"
data-callback='onSubmit'
data-action='submit'>Вход</button>
Сега в контролера, в който взимаме формата (в нашият случай app/Http/Controllers/Auth/LoginController.php
):
use App\Rules\Recaptcha;
.....
protected function validateLogin(Request $request)
{
$request->validate([
$this->username() => 'required|string',
'password' => 'required|string',
'g-recaptcha-response' => ['required', new Recaptcha()]
]);
}