...

Интегриране в Laravel на reCaptcha v3

Добавяне на капча проверка във всяка една форма в Ларавел
преди 1 месец

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()]
        ]);
    }