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 参数的合法值。
我在 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 参数的合法值。