5
votes

reCAPTCHA V3: comment gérer un jeton expiré après une inactivité?

Pour Google reCAPTCHA V2, il était clair que faire lorsque le jeton expirait en raison d'une inactivité: le client a une modification pour cliquer à nouveau sur la case à cocher reCaptcha. Pour Google reCAPTCHA V3, c'est différent car on ne sait pas quand le jeton expire en raison de l'inactivité.

Pour reCAPTCHA V3, il est suggéré par Google:

https://developers.google.com/recaptcha/docs/v3 < / p>

  1. Chargez l'API JavaScript avec votre clé de site

  2. Appeler grecaptcha.execute sur une action ou lorsque la page se charge // on choisit quand la page se charge, OK?

  3. Envoyez le jeton à votre backend avec la demande de vérification // en cliquant sur le bouton

OK. Si le bouton a été cliqué plusieurs minutes après le chargement de la page, le jeton V3 que nous envoyons au backend est déjà expiré. Quelle est la bonne façon de faire face à cette situation? Devrions-nous mettre à jour automatiquement le jeton en silence en envoyant des appels à Google toutes les minutes? Quelle est la meilleure approche pour ce cas? Je n'ai trouvé aucune suggestion de Google.


3 commentaires

Ensuite, je l'exécuterais en cliquant sur le bouton


Avez-vous compris cela? J'ai le même problème avec le cas d'utilisation 3. Je reçois le jeton au chargement de la page mais il a expiré au moment où le formulaire est envoyé au BE.


@ JoãoBelo Oui. Le jeton doit être généré plus tard qu'au chargement de la page. Il devrait être généré juste avant de l'envoyer au backend. Avec un autre mot, nous cliquons sur le bouton (de mon exemple), puis récupérons le token généré, puis envoyons le token à mon backend.


3 Réponses :


3
votes

Le jeton doit être généré plus tard qu'au chargement de la page. Il doit être généré juste avant de l'envoyer au backend. Avec un autre mot, nous cliquons sur le bouton (de mon exemple), puis récupérons le token généré, puis envoyons le token au backend.

Cette solution a du sens et résout mon problème.


1 commentaires

La solution n'est pas parfaite. Parce que, lorsque nous demandons le jeton juste avant l'envoi. Le formulaire a besoin d'attendre quelques secondes pour recevoir le jeton et envoyer avec les données.



0
votes

Je travaille sous les formulaires asp.net, mais cette solution peut être applicable dans n'importe quelle langue. Le problème du jeton expiré est ennuyeux.

Le jeton a une durée de validité de 2 minutes dans la v3, mais la pratique consistant à laisser une minuterie actualisant le jeton toutes les 2 minutes n'est pas recommandée par Google. Ils recommandent d'actualiser le jeton uniquement lorsque cela est nécessaire.

J'ai opté pour une solution javascript, forçant le client à cliquer sur un bouton qui actualise le jeton.

Il convient de noter que si "recaptcha.ready" est exécuté lors de l'actualisation du recaptcha, une erreur est générée, j'ai donc dû séparer le "prêt" de "l'exécuter" et avec cela le recaptcha est actualisé sans erreurs.

 <asp:Button ID="Btn_Ingresar" runat="server" Text="Ingresar" CssClass="button_gris" Enabled="false" />
 <input type="button" id="Btn_Refrescar" name="Btn_Refrescar" class="button_verde" value="Refrescar Token" title="Refrescar Token" onclick="los_dos(document.getElementById('g-recaptcha-response').value);" style="display: none;" />
          


0 commentaires

2
votes

Étant donné que les jetons reCAPTCHA expirent au bout de deux minutes, voici comment je l'ai mis en œuvre:

Étape 1: Chargez le jeton captcha lors du chargement de la page (comme d'habitude)

Étape 2: Utilisez un SetInterval pour recharger le jeton toutes les 90 secondes, afin que le jeton reCAPTCHA soit actualisé avant d'expirer après 2 minutes.

//Onload
grecaptcha.ready(function () {
   grecaptcha.execute("YOUR_KEY_HERE", {action: "request_call_back"}).then(function (e) {
      $("#YOUR_FIELD_NAME_ID").val(e);
   });
});

//Every 90 Seconds
setInterval(function () {
   grecaptcha.ready(function () {
      grecaptcha.execute("YOUR_KEY_HERE", {action: "request_call_back"}).then(function (e) {
         $("#YOUR_FIELD_NAME_ID").val(e);
      });
}, 90 * 1000);


0 commentaires