---
title: "Aggiungere Turnstile di Cloudflare a Laravel Breeze Auth"
id: "343"
type: "post"
slug: "aggiungere-turnstile-di-cloudflare-a-laravel-breeze-auth"
published_at: "2026-06-03T10:21:18+00:00"
modified_at: "2026-06-03T10:21:18+00:00"
url: "https://pierluigipapeschi.com/aggiungere-turnstile-di-cloudflare-a-laravel-breeze-auth/"
markdown_url: "https://pierluigipapeschi.com/aggiungere-turnstile-di-cloudflare-a-laravel-breeze-auth.md"
excerpt: "La scorsa settimana abbiamo visto come aggiungere la protezione delle pagine di login di Filament da accessi non autorizzati eseguiti da bots, usando la tecnologia di Cloudflare chiamata Turnstile, vedi questo articolo. Se non hai ancora creato un progetto Laravel..."
taxonomy_category:
  - "Intelligenza artificiale"
  - "Laravel"
---

La scorsa settimana abbiamo visto come aggiungere la protezione delle pagine di login di Filament da accessi non autorizzati eseguiti da bots, usando la tecnologia di Cloudflare chiamata Turnstile, vedi [questo articolo](https://pierluigipapeschi.com/aggiungere-turnstile-a-laravel-filament/)
.

Se non hai ancora creato un progetto Laravel che gestisca l’autenticazione segui [questo articolo](https://pierluigipapeschi.com/creare-progetto-laravel-con-spatie-permissions-filament/)
.

## Turnstile

Immagino che avrai già un account su Cloudflare, ma nel caso non lo avessi ancora puoi andare [qui](https://www.cloudflare.com/it-it/application-services/products/turnstile/)
. Una volta creato l’account devi creare il primo widget, assegnargli un nome che serve a te e aggiungere un dominio (quello del tuo progetto… ovviamente).

A questo punto ti verranno mostrate le 2 chiavi necessarie: SITE_KEY e SECRET_KEY, quindi salvale in fondo al file **.env**:

```
TURNSTILE_SITE_KEY=xxxxxxxx
TURNSTILE_SECRET_KEY=xxxxxxxx
```

Rendiamole accessibili inserendo questo codice nel file **config/services.php**, prima della chiusura dell’array:

```
'turnstile' => [
    'site_key' => env('TURNSTILE_SITE_KEY'),
    'secret_key' => env('TURNSTILE_SECRET_KEY'),
],
```

## Laravel Rule

Creiamo una “regola” di Laravel che gestisca la validazione del token creato da Turnstile e per farlo eseguiamo da console:

```
php artisan make:rule Turnstile
```

Viene quindi creato il file Turnstile.php dentro la cartella **app/Rules**. Il contenuto sarà questo:

```
<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Support\Facades\Http;

class Turnstile implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $response = Http::asForm()->post('https://challenges.cloudflare.com/turnstile/v0/siteverify', [
            'secret'   => config('services.turnstile.secret_key'),
            'response' => $value,
            'remoteip' => request()->ip(),
        ]);

        if (! $response->json('success')) {
            $fail(__('Verifica CAPTCHA non riuscita. Riprova.'));
        }
    }
}
```

### Controllers

Apri il file **RegisteredUserController.php** dentro **app/Http/Controllers/Auth** ed aggiungi la libreria in alto`use App\Rules\Turnstile;`

e la regola di validazione `'cf-turnstile-response' => ['required', new Turnstile],` nell’array `$request->validate([...]);` dentro il metodo **store**.

### Requests

Stesso discorso per il file **LoginRequest.php** dentro **app/Http/Requests/Auth**, ma stavolta il metodo si chiama **rules**.

### Views

Siamo alle battute finali: adeguiamo le view blade per integrare il token di Turnstile. Cominciamo da **register.blade.php**:

Prima della chiusura del tag *form* (</form>) richiamiamo la libreria javascript:

```
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
```

e poco sopra, prima dell’ultimo bottone aggiungiamo un elemento contenente i dati necessari al meccanismo di controllo:

```
<div class="mt-4">
  <div class="cf-turnstile" data-sitekey="{{ config('services.turnstile.site_key') }}"></div>
  <x-input-error :messages="$errors->get('cf-turnstile-response')" class="mt-2" />
</div>
```

## Pulire tutto

Sembra una banalità, ma non lo è: quando si interviene sul file .env, sulle configurazioni, e talvolta nelle views, conviene sempre pulire le varie cache:

```
php artisan config:clear
php artisan cache:clear
```

Adesso basterà andare sulla pagina di registrazione o login (che con Breeze saranno banalmente “register” e “login”) e fare i test del caso.
