错误:不存在任何reCAPTCHA客户端(reCAPTCHA v3)

时间:2018-12-20 20:01:30

标签: recaptcha recaptcha-v3

我以一种形式集成了reCAPTCHA v3。在onload中,在右下角有一个令牌生成和google captcha徽标。但是,当我提交表单时,在控制台中显示了一个错误,“错误:不存在reCAPTCHA客户端”。同样,似乎没有数据通过“ g-recaptcha-response”获取,并且$ _POST [“ g-recaptcha-response”]保持为空。

这是示例代码:

<script type="text/javascript">
    var ReCaptchaCallbackV3 = function() {
        grecaptcha.ready(function() {
            grecaptcha.execute("site_key").then(function(token) {
                console.log("v3 Token: " + token);
            });
        });
    };
</script>

<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3&render=site_key"></script>

提交表单时,它不会产生任何“ g-recaptcha-response”。

我对Google reCaptcha不太了解。我遵循了他们提供的文档,并以适当的方式使用了站点和密钥。

有人可以告诉我问题出在哪里以及可能的解决方法是什么

6 个答案:

答案 0 :(得分:2)

我遇到了这个问题,因为当站点上没有任何Recaptcha激活时,我正在打电话给class ModelB(models.Model): fieldB1 = models.CharField(max_length=20) fieldB2 = models.ForeignKey(modelA) def clean(self): """ Validate 'fieldB1', 'fieldB2' and 'fieldB2__fieldA2' are unique together """ # first, check that foreign keys fields exist. Must use '_id', or else a RelatedObjectDoesNotExist error will be raised if self.fieldB2_id and self.fieldB2.field_A2_id: if self.__class__.objects.filter(fieldB1=self.fieldB1, fieldB2=self.fieldB2, fieldB2__fieldA2=self.fieldB2.fieldA2).exists(): raise ValidationError( _('Instance of ModelB with fieldB1, fieldB2 and fieldB2.fieldA2 already exists.'), code='unique_together', )

grecaptcha.reset();

答案 1 :(得分:1)

在用户与Recaptcha 2进行交互之前,也会发生这种情况。因此,我有一个提交按钮,该按钮触发一个JS函数来检查recaptcha的值。为了解决没有客户存在的问题,我做了:

try {
   data["reCaptcha"] = grecaptcha.getResponse();
} catch (err) {
   data["reCaptcha"] = "";
}

然后,将数据对象发送到验证Recaptcha的后端脚本。后端还检查该字段是否为空。

答案 2 :(得分:1)

我相信在加载reCaptcha api.js时会发生此错误,但是您的容器尚未出现在页面上(至少对于v2而言)。当我导航到页面而不是首先加载页面时,我在React应用程序中发生了此错误。无需使用render=explicit和全局命名空间onLoadCallback,我能够通过手动呈现captcha元素来解决它。

与其创建<div class="g-recaptcha"></div>,不如给容器div一个id(<div id="recaptcha-container"></div>),然后在您的JS代码中呈现它(例如,在React应用的componentDidMount中):

grecaptcha.ready(function() {
  grecaptcha.render("recaptcha-container", {
    "sitekey": "your-site-key"
  });
});

答案 3 :(得分:0)

您是否尝试过在尝试发送请求之前加载脚本?

<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallbackV3&render=site_key"></script>
<script type="text/javascript">
    var ReCaptchaCallbackV3 = function() {
        grecaptcha.ready(function() {
            grecaptcha.execute("site_key").then(function(token) {
                console.log("v3 Token: " + token);
            });
        });
    };
</script>

答案 4 :(得分:0)

当我在reCAPTCHA v3中遇到此问题时,是因为我没有将正确的站点密钥传递给它。

答案 5 :(得分:0)

我正在使用React,有时只渲染我的验证码容器。通过隐藏验证码按钮而不是不显示按钮来解决。