Laravel Turnstile
#Laravel Turnstile
Laravel Turnstile, is a package to help you implement cloudflare turnstile easily, and with no time.
#Installation
You can install the package via composer:
composer require coderflex/laravel-turnstile
You can publish the config file with:
php artisan vendor:publish --tag="turnstile-config"
This is the contents of the published config file:
return [ /* |-------------------------------------------------------------------------- | Turnstile Keys |-------------------------------------------------------------------------- | | This value is the site, and the secret key of your application, after creating an application | with Cloudflare turnstile, copy the site key, and use it here, or in the .env | file. | Note that the secret key should not be publicly accessible. | | @see: https://developers.cloudflare.com/turnstile/get-started/#get-a-sitekey-and-secret-key | */ 'turnstile_site_key' => env('TURNSTILE_SITE_KEY', null), 'turnstile_secret_key' => env('TURNSTILE_SECRET_KEY', null), /* |-------------------------------------------------------------------------- | Error Messages |-------------------------------------------------------------------------- | | Here you can find the error messages for the application. You can modify | or translate the error message as you like. | | Note that you can translate the error message directly, without wrapping | them in translate helper. | */ 'error_messages' => [ 'turnstile_check_message' => 'The CAPTCHA thinks you are a robot! Please refresh and try again.', ], ];
Optionally, you can publish the views using:
php artisan vendor:publish --tag="turnstile-views"
#Turnstile Keys
To be able to use Cloudflare Turnstile, you need to get the SiteKey, and the SecretKey from your Cloudflare dashboard
After Generating the keys, use TURNSTILE_SITE_KEY, and TURNSTILE_SECRET_KEY in your .env file
TURNSTILE_SITE_KEY=2x00000000000000000000AB TURNSTILE_SECRET_KEY=2x0000000000000000000000000000000AA
If you want to test the widget, you can use the Dummy site keys and secret keys that Cloudflare provides.
#Usage
#Turnstile Widget Component
Once you require this package, you can use the turnstile widget in your form, like the following
<x-turnstile-widget theme="dark" language="en-US" size="normal" callback="callbackFunction" errorCallback="errorCallbackFunction" />
As you can see, the widget has few options to use. You can know more about them in the configuration section
#Turnstile Backend Validation
Once you used the widget component, in the frontend. You can validate Cloudflare Response, by using the validate method.
Here's an example:
use Coderflex\LaravelTurnstile\Facades\LaravelTurnstile; public function store(Request $request) { // maybe you want to validate your form first $response = LaravelTurnstile::validate(); if (! $response['success']) { // will return boolean // do your logic } }
You may, optionally, send the Cloudflare response with the validation method. Something like the following:
public function store(Request $request) { ... $response = LaravelTurnstile::validate( $request->get('cf-turnstile-response'); // this will be created from the cloudflare widget. ); ... }
#Turnstile Custom Rule
If you want clean validation, you can use the TurnstileCheck custom rule, along with your form validation. Here's an example:
use Coderflex\LaravelTurnstile\Rules\TurnstileCheck; public function store(Request $request) { $request->validate([ 'cf-turnstile-response' => [new TurnstileCheck()] ]); }
The custom rule, will use the same logic, as the backend validation, but instead will check for the response, and return a validation message, if the captcha fails.
You can change the content of the validation message, in config/turnstile.php file
return [ ... 'error_messages' => [ 'turnstile_check_message' => 'The CAPTCHA thinks you are a robot! Please refresh and try again.', ], ];
PS: If you want to translate the message, just copy the message and translate it, because it uses the translator method behind the scene.
#Real Life Example
In your blade file
<form action="" method="post"> @csrf <div> <input type="text" name="name" /> @error('name') <p class="error">{{ $message }}</p> @enderror </div> <div> <x-turnstile-widget theme="auto" language="fr"/> @error('cf-turnstile-response') <p class="error">{{ $message }}</p> @enderror </div> <button>Submit</button> </form>
In your controller:
use Coderflex\LaravelTurnstile\Rules\TurnstileCheck; use Coderflex\LaravelTurnstile\Facades\LaravelTurnstile; ... public function store(Request $request) { $request->validate([ 'name' => ['required', 'string', 'max:250'], 'cf-turnstile-response' => ['required', new TurnstileCheck()], ]); // or $response = LaravelTurnstile::validate(); if (! $response['success']) { // do your thing. } // do your things. }
#Testing
composer test
#Changelog
Please see CHANGELOG for more information on what has changed recently.
#Contributing
Please see CONTRIBUTING for details.
#Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
#Credits
#License
The MIT License (MIT). Please see the License File for more information.