google repatcha返回false,原因是“;无效输入秘密”;


google recaptcha returns false due to "invalid-input-secret"

我已经从谷歌安装了最新的repatcha,但它在提交后总是返回false,并且总是返回"无效输入机密"错误,即使从前端视图来看验证总是正确的。这可能是什么原因。顺便说一句,我正在用phalcon框架测试localhost examplep中的所有内容。这是我检查captcha:的部分

protected function validate_data($post, $ip){
    $validation = new Validation();
    $validation->add(
        'user_name',
        new PresenceOf(
            array(
                'message' => 'The Username is required'
            )
        )
    );
    $validation->add(
        'email',
        new PresenceOf(
            array(
                'message' => 'The e-mail is required'
            )
        )
    );
    $validation->add(
        'password',
        new PresenceOf(
            array(
                'message' => 'The Password is required'
            )
        )
    );
    $validation->add(
        'cpassword',
        new PresenceOf(
            array(
                'message' => 'The Confirmation Password is required'
            )
        )
    );
    $validation->add(
        'email',
        new Email(
            array(
                'message' => 'The e-mail is not valid'
            )
        )
    );
    $validation->add('password', 
        new Confirmation(array(
           'message' => 'Password doesn''t match confirmation',
           'with' => 'cpassword'
           )
        )
    );
    $error = $validation->validate($post);
    $errors = array();
    if(count($error)){
        foreach($error as $e){
            $errors[] = $e;
        }
    }
    $data = array(
        'secret' => "my secret key",
        'response' => $post['g-recaptcha-response'],
        'remoteip' => $ip
    );
    $verify = curl_init();
    curl_setopt($verify, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
    curl_setopt($verify, CURLOPT_POST, true);
    curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
    $res = curl_exec($verify);
    $captcha = json_decode($res);
    if($captcha->success == false){
        $errors[] = "Invalid Captcha, You are a freakin robot!";
    }
    return $errors;
}

这可能是什么原因?这是转储响应时的输出:

object(stdClass)#70 (2) { ["success"]=> bool(false) ["error-codes"]=> array(1) { [0]=> string(20) "invalid-input-secret" } } 

整个问题的出现是因为谷歌的窥探者感到困惑。他们创建了多个通道来实现reCAPTCHA注册。如果您遇到了这个错误,我相信您已经按照第一种方法为您的reCAPTCHA应用程序生成了SECRET KEY。

  1. 您访问的网站:https://console.cloud.google.com/security/recaptcha并为您的网站生成reCAPTCHA密钥。请注意,这是一个谷歌云控制台链接,您必须只收到前端和后端的一个密钥。

  2. 您访问的网站:https://www.google.com/recaptcha/admin/create并为您的应用程序生成reCAPTCHA密钥。请注意,这不是一个谷歌云控制台网站,而是一个单独的网站,它将为您提供两个不同的密钥,一个用于后端,另一个用于前端。使用这些钥匙,你就可以上路了。

这对谷歌来说很糟糕,因为他们为同一个目标设施提供了多个来源,其中一种方式有点过时或不起作用。

我真傻,我仔细检查了密钥,结果一开始只缺少一个字符。这解决了问题。

对于javascript

在我的案例中,我使用了环境变量我用双引号"6Lfg1_0UAAAAABWdUn5gNhXEuLxhpkQyheDpLbnB"定义了这个变量。因此,当通过url传递密钥时,它将包含在双引号中。这就是我的问题所在。url中不应包含双引号。

当你定义环境变量时,用单引号定义,如下所示:

RECAPTCHA_SECRET_KEY='6Lfg1_0UAAAAABWdUn5gNhXEuLxhpkQyheDpLbnB'

对Sarthik Gupta答案的补充:

此问题是由于您要使用的重述帐户类型:

  1. https://www.google.com/recaptcha/admin/create是针对企业帐户的,因此在这种情况下,一旦创建了客户端密钥,就应该使用在谷歌云控制台中创建的API密钥或服务帐户来执行身份验证,如下所述https://cloud.google.com/recaptcha-enterprise/docs/using-features?_ga=2.231710239.-1292418016.1646407998#迁移后端
  2. https://www.google.com/recaptcha/admin/create用于免费帐户,在这种情况下,客户端和服务器密钥都会创建并直接可用