Chargement de reCAPTCHA

Ce document décrit les bonnes pratiques à suivre pour charger la balise de script reCAPTCHA. Ces informations s'appliquent à la fois à reCAPTCHA v2 et v3.

Charger reCAPTCHA de manière asynchrone

Toutes les versions du reCAPTCHA peuvent être chargées de manière asynchrone. Le chargement asynchrone de reCAPTCHA n'a aucune incidence sur sa capacité à identifier le trafic suspect. En raison des avantages en termes de performances des scripts asynchrones, il est généralement recommandé de charger reCAPTCHA de manière asynchrone.

<script async src="https://www.google.com/recaptcha/api.js">

Lorsque vous chargez reCAPTCHA de manière asynchrone, gardez à l'esprit que reCAPTCHA ne peut pas être utilisées jusqu'à la fin du chargement. Par exemple, le code suivant risque de planter :

<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
  // If reCAPTCHA is still loading, grecaptcha will be undefined.
  grecaptcha.ready(function(){
    grecaptcha.render("container", {
      sitekey: "ABC-123"
    });
  });
</script>

Dans certains cas, ajuster l'ordre des scripts peut suffire à éviter les conditions de course. Vous pouvez également éviter les conditions de course en incluant l'extrait de code suivant sur les pages qui chargent reCAPTCHA. Si vous utilisez grecaptcha.ready() pour encapsuler les appels d'API, ajoutez l'extrait de code suivant pour vous assurer que reCAPTCHA peut être appelé à tout moment.

<script async src="https://www.google.com/recaptcha/api.js"></script>
<script>
  // How this code snippet works:
  // This logic overwrites the default behavior of `grecaptcha.ready()` to
  // ensure that it can be safely called at any time. When `grecaptcha.ready()`
  // is called before reCAPTCHA is loaded, the callback function that is passed
  // by `grecaptcha.ready()` is enqueued for execution after reCAPTCHA is
  // loaded.
  if(typeof grecaptcha === 'undefined') {
    grecaptcha = {};
  }
  grecaptcha.ready = function(cb){
    if(typeof grecaptcha === 'undefined') {
      // window.__grecaptcha_cfg is a global variable that stores reCAPTCHA's
      // configuration. By default, any functions listed in its 'fns' property
      // are automatically executed when reCAPTCHA loads.
      const c = '___grecaptcha_cfg';
      window[c] = window[c] || {};
      (window[c]['fns'] = window[c]['fns']||[]).push(cb);
    } else {
      cb();
    }
  }

  // Usage
  grecaptcha.ready(function(){
    grecaptcha.render("container", {
      sitekey: "ABC-123"
    });
  });
</script>

Les sites qui utilisent l'API v2 peuvent également utiliser le rappel onload. Le rappel onload est exécuté lorsque le chargement de reCAPTCHA est terminé. Vous devez définir le rappel onload avant de charger le reCAPTCHA script.

<script>
  const onloadCallback = function() {
    console.log("reCAPTCHA has loaded!");
    grecaptcha.reset();
  };
</script>
<script async src="https://www.google.com/recaptcha/api.js?onload=onloadCallback”></script>

Si vous ne pouvez pas charger reCAPTCHA de manière asynchrone, y compris preconnect Nous vous recommandons vivement d'utiliser les indices de ressources pour reCAPTCHA. Cela réduit le temps pendant lequel le téléchargement du script bloque l'analyseur.

Utiliser les optimisations de ressources

L'inclusion des optimisations de ressource suivantes dans le champ <head> du document réduire le temps nécessaire à la livraison des ressources utilisées par reCAPTCHA. L'indice de ressource preconnect indique au navigateur d'établir une connexion anticipée avec une origine tierce.

<link rel="preconnect" href="https://www.google.com">
<link rel="preconnect" href="https://www.gstatic.com" crossorigin>

Chargement différé

En règle générale, plus reCAPTCHA dispose de contexte sur une page, plus il est en mesure de déterminer si les actions des utilisateurs sont légitimes. C'est particulièrement vrai lorsque vous utilisez des versions de reCAPTCHA qui ne reposent pas sur des défis utilisateur. Attendre le chargement de reCAPTCHA jusqu'à ce qu'une action restreinte spécifique (par exemple, l'envoi d'un formulaire) n'est généralement pas recommandée.