4
votes

J'ai eu une erreur "timeout-or-duplicate" en utilisant ReCaptcha v3

J'ai un formulaire de contact sur mon site Web sur Laravel et j'aimerais placer un ReCaptcha v3 mais pour l'instant, le résultat que j'ai obtenu de la vérification est l'erreur "timeout-or-duplicate".

Pouvez-vous m'aider moi de A à Z? Je ne sais pas où aller ...

Ma tête:

{
  "success": true,
  "score" : x,
  "error-codes": '',
}

Le formulaire de contact:

{
  "success": false,
  "error-codes": [
    "timeout-or-duplicate"
  ]
}


0 commentaires

4 Réponses :


4
votes

Chaque fois que la page se recharge, vous recevez un nouveau jeton de Google. Vous ne pouvez utiliser ce jeton qu'une seule fois. D'une manière ou d'une autre, si vous utilisez ce jeton plus d'une fois pour obtenir la réponse de Google Api, vous obtiendrez cette erreur. Vérifiez cette référence d'erreur https://developers.google.com/recaptcha/docs/ vérifier? hl = fr


0 commentaires

2
votes

J'ai reçu ceci de personnes qui cliquent deux fois sur le bouton d'envoi du formulaire.


0 commentaires

5
votes

Comme indiqué dans la documentation , cette erreur est due à:

  1. La durée de validité du jeton a expiré (une fois que vous avez obtenu le jeton de réponse, vous devez le vérifier dans les deux minutes)
  2. Le jeton a été utilisé précédemment. Pour confirmer cela, enregistrez la valeur du jeton avant son utilisation (journal des erreurs, fichier local, etc.)

Ma résolution pour 1, définissez un intervalle qui appelle la fonction de jeton set, donc elle est actualisée toutes les 2 minutes.

$(document).ready(function() {

            SetCaptchaToken();
            setInterval(function () { SetCaptchaToken(); }, 2 * 60 * 1000);

    });

Résolution pour 2, correction votre code :)


2 commentaires

SetCaptchaToken ?? où est-ce défini?


c'est ma fonction personnalisée qui définit le jeton



2
votes

Le problème est ce morceau de code:

<script src="https://www.google.com/recaptcha/api.js?render=My_Site_Key"></script>
<script>
  grecaptcha.ready(function() {
      document.getElementById('contact-form').addEventListener("submit", function(event) {
        event.preventDefault();
        grecaptcha.execute('My_Site_Key', {action: 'contact'}).then(function(token) {
           document.getElementById("recaptchaResponse").value= token; 
           document.getElementById('contact-form').submit();
        });
      }, false);
  });
</script>

Le jeton n'est valide que pendant 2 minutes après que vous exécutez est appelé comme indiqué dans le docs :

Remarque: les jetons reCAPTCHA expirent au bout de deux minutes. Si vous protégez une action avec reCAPTCHA, assurez-vous d'appeler execute lorsque l'utilisateur effectue l'action.

Ainsi, si vous passez plus de 2 minutes sur le formulaire de contact, vous obtenez l'erreur de temporisation. C'est pourquoi il est recommandé dans la documentation d'appeler uniquement execute si l'utilisateur soumet réellement votre formulaire / prend des mesures. Dans vanilla JS, cela ressemblerait à ceci:

<script src="https://www.google.com/recaptcha/api.js?render=My_Site_Key"></script>
  <script>
    grecaptcha.ready(function () {
      grecaptcha.execute('My_Site_Key', { action: 'contact' }).then(function (token) {
        var recaptchaResponse = document.getElementById('recaptchaResponse');
          recaptchaResponse.value = token;
      });
    });
  </script>


0 commentaires