reCAPTCHA V3:闲置后如何处理过期的令牌?

Har*_*iec 5 javascript token recaptcha recaptcha-v3

对于Google reCAPTCHA V2,很清楚当令牌由于闲置而过期时该怎么办:客户可以进行更改,再次单击reCaptcha复选框。对于Google reCAPTCHA V3,有所不同,因为尚不清楚令牌是否由于空闲而过期。

对于reCAPTCHA V3,Google建议:

https://developers.google.com/recaptcha/docs/v3

  1. 使用sitekey加载JavaScript api

  2. 在操作或页面加载时调用grecaptcha.execute //我们选择页面加载的时间,好吗?

  3. 将令牌与请求一起发送到您的后端 //单击按钮后进行验证

好。如果在加载页面后几分钟点击了该按钮,则我们发送到后端的V3令牌已经过期。在这种情况下应对的正确方法是什么?我们是否应该每分钟通过发送呼叫给Google来无声地自动更新令牌?这种情况下最好的方法是什么?我没有找到Google的任何建议。

Har*_*iec 8

令牌必须晚于页面加载生成。它应该在我们将其发送到后端之前生成。换句话说,我们点击按钮(来自我的例子),然后获取生成的令牌,然后将令牌发送到后端。

此解决方案有意义并解决了我的问题。

  • 该解决方案并不完美。因为,当我们在发送之前请求令牌时。该表单需要等待几秒钟才能接收令牌并随数据一起发送。 (2认同)

小智 5

由于 reCAPTCHA 令牌在两分钟后过期,这就是我让它工作的方式:

第 1 步:在页面加载时加载验证码令牌(像往常一样)

步骤2:使用SetInterval函数每90秒重新加载令牌,以便reCAPTCHA令牌在2分钟后过期之前刷新。

//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);
Run Code Online (Sandbox Code Playgroud)