Google 的新 reCaptcha 站点验证 returns 无响应

Google's new reCaptcha site verification returns no responce

我在 g-recaptcha-response 通过用户验证后 site verification

我发送带有参数的 xhr POST 并得到 200 OK,但没有响应,因为它应该是:

{
  "success": true|false,
  "error-codes": [...]   // optional
}

代码

<script type='text/javascript'>    
var onReturnCallback = function(response) { 
document.getElementById('resp').innerHTML = response; // works well
//alert('grecaptcha.getResponse() = ' + grecaptcha.getResponse()); // works well too
$.post("https://www.google.com/recaptcha/api/siteverify", 
          { secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            response: response,
            remoteip :  "<?php echo $ip;?>" // optional, does not influence an empty result           
           }).complete(function( data ) {
                alert( "Data returned from POST: " + data.toString() );
                console.dir(data);
              });  

};
</script>
Form.  
<form method="post"> 
<div class="g-recaptcha" data-sitekey="6LdYKQkTAAAAAD9K6-kHspFUPUnftw1RxP5_awi0" data-callback="onReturnCallback" data-theme="light">       </div>
<input name="send" type="submit" />
</form>

我在控制台打印的object完全是空的(除了statusText='error'),见shot

控制台中还有其他错误:

XMLHttpRequest cannot load https://www.google.com/recaptcha/api/siteverify. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://tarex.ru' is therefore not allowed access.

如何处理?我可以更改原点 header 吗?如何验证?

link 到演示。

由于所谓的 "same origin policy" (SOP) 以防止 XSS 攻击,因此无法将 XHR ("AJAX requests") 发送到为网站提供服务的主机以外的主机。

但是,您可以 post 从 php 代理访问 reCaptcha 站点,您 运行 在自己的主机上。 in this answer 给出了一个例子。这也可以防止您的秘密被 public 给查看您的客户端源代码的人。

另一种可能性(取决于您要使用的服务)是JSONP。由于禁止 XHR,但禁止从外部主机加载脚本,因此可以通过查询参数向脚本添加回调函数的名称 URL。一旦加载了外部资源,就会调用此函数。但据我所知reCaptcha不支持JSONP。

reCaptcha 据称支持 jsonp 作为 dataType 参数的合法值。