## Google Recaptcha

Google recaptcha permet d'éviter le spam sur les formulaires.<br>

Google reCAPTCHA v3 permet de distinguer les utilisateurs humains des bots **sans interaction visible**. Il repose sur un système de scoring basé sur le comportement utilisateur et s’intègre en **frontend (JavaScript)** et **backend (vérification serveur)**.

La première partie détaille la mise en place technique (sans plugin), la seconde traitera de l'utilisation d'une dépendance (installée via composer sur le projet)

---

## Étapes de mise en œuvre (sans plugin)

### 1. **Chargement du script reCAPTCHA sur la page**
Dans le `<head>` ou juste avant la fin du `<body>`, le script reCAPTCHA est inclus :

```html
<script src="https://www.google.com/recaptcha/api.js?render=SITE_KEY"></script>
```

### 2. **Exécution de `grecaptcha.execute()`**

Dans le code JavaScript (au chargement de la page ou avant l’envoi d’un formulaire), reCAPTCHA est exécuté pour obtenir un **token JWT** :

```javascript
grecaptcha.ready(function() {
  grecaptcha.execute('SITE_KEY', {action: 'homepage'}).then(function(token) {
    // Le token est inséré dans un champ caché du formulaire ou envoyé via AJAX
    document.getElementById('recaptcha_token').value = token;
  });
});
```

- L'`action` est un nom arbitraire qui décrit le contexte (ex: `"login"`, `"contact_form"`), utilisé plus tard pour l'analyse des scores côté serveur.

### 3. **Transmission du token au serveur**

Le token est envoyé au backend (via un champ `POST`, un header ou JSON) avec le reste des données du formulaire.

```http
POST /api/contact HTTP/1.1
Content-Type: application/json

{
  "name": "Toto",
  "message": "Bonjour",
  "recaptcha_token": "eyJhbGciOiJSUzI1..."
}
```

### 4. **Vérification du token côté serveur**

Sur le serveur, une requête HTTPS POST est envoyée à l’API Google pour valider le token :

```http
POST https://www.google.com/recaptcha/api/siteverify
Content-Type: application/x-www-form-urlencoded

secret=SECRET_KEY&response=recaptcha_token&remoteip=IP_UTILISATEUR
```

### 5. **Réponse de l’API Google**

Google renvoie une réponse JSON contenant :

```json
{
  "success": true,
  "score": 0.9,
  "action": "homepage",
  "hostname": "url-toto.com"
}
```

- `score` : entre 0.0 (bot) et 1.0 (humain)
- `action` : doit correspondre à celui spécifié dans `execute()`
- `hostname` : pour vérifier que le token provient bien de votre site (URL)

### 6. **Décision côté serveur**

En fonction du score, vous appliquez une logique métier :

```php
if ($response["success"] && $response["score"] > 0.5) {
    $this->traiter_le_formulaire();
} else {
    $this->bloquer_ou_afficher_un_captcha_alternatif();
}
```

---

De notre coté l'intégration d'un plugin dédié à l'utilisation de Recaptcha v3 nous simplifie la tâche.

<br>
Il s'agit du plugin victor-prdh/recaptcha-bundle

## Utilisation du plugin

1. Créer une clé API sur Google Recaptcha : https://g.co/recaptcha/v3
2. Modifier dans le fichier .env.local les 2 variables suivantes :
```
GOOGLE_RECAPTCHA_SITE_KEY=
GOOGLE_RECAPTCHA_SECRET_KEY=
```
3. Modifier le FormType devant contenir le recaptcha v3, en ajoutant :
- le use (sur PhpStorm il s'ajoutera tout seul, donc facultatif)
```php
use VictorPrdh\RecaptchaBundle\Form\ReCaptchaType;
```
- le champ :
```php
$builder->add("recaptcha", ReCaptchaType::class);
```
**Note :** Il est possible de rendre le champ invisible :
```php
$builder->add("recaptcha", ReCaptchaType::class, ["type" => "invisible"]);
```