Javascript reCAPTCHA 2是否需要密钥?

Javascript reCAPTCHA 2是否需要密钥?,javascript,recaptcha,verify,Javascript,Recaptcha,Verify,我刚刚开始尝试谷歌的reCAPTCHA工具/服务,对它的工作原理感到困惑。我遵循了2.0版本的指南,该版本似乎适合我(在我的本地主机上)——但我还没有使用密钥。仅当主机/域不是“localhost”时才需要密钥吗 我们的网站依靠DWR(AJAX)而不是表单提交与后端交互,因此我希望能够以某种方式捕获用户的响应,并将其发送到我们的DWR java方法,然后将其发布到Google的验证服务URL。不过我似乎不需要这么做 我已将以下内容添加到我的主jsp文件中: <script src='htt

我刚刚开始尝试谷歌的reCAPTCHA工具/服务,对它的工作原理感到困惑。我遵循了2.0版本的指南,该版本似乎适合我(在我的本地主机上)——但我还没有使用密钥。仅当主机/域不是“localhost”时才需要密钥吗

我们的网站依靠DWR(AJAX)而不是表单提交与后端交互,因此我希望能够以某种方式捕获用户的响应,并将其发送到我们的DWR java方法,然后将其发布到Google的验证服务URL。不过我似乎不需要这么做

我已将以下内容添加到我的主jsp文件中:

<script src='https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit' async defer></script>
...
<div id="captchaDiv"></div>
而verifyCaptchaCallback函数只有在用户满足挑战时才会被调用。我还没有用过这把秘钥。我错过什么了吗?或者这就是版本2的预期工作方式—不需要服务器端处理?我看到,当我单击质询图像对话框上的验证按钮时,一个帖子被发送到google,并且明显返回一个失败/成功标志,该标志导致reCAPTCHA要么呈现另一个图像质询,要么停止。我并没有手动将结果发送到谷歌的验证服务URL——这似乎是自动发生的。这种行为是否仅仅是因为我仍在使用“localhost”在开发人员系统上进行测试,而一旦webapp移动到我们的客户系统,这种行为就会失败

感谢您提供的任何澄清。
Gregor

您确实需要验证用户的单击。查看如何重新捕获和如何执行它

不需要验证谷歌的服务URL

您仍然需要使用
g\u recaptcha\u response
value进行验证。但是你需要在服务器端完成!当表单提交到服务器时,您可以在服务器上发布['g_recaptcha_response']

var verifyCaptchaCallback = function(g_recaptcha_response) {
   console.log("Response validated.  Not a robot."); 
   // you can't do this now, since 'g_recaptcha_response' is an encoded value, neither true, nor false. 
}
在服务器上执行最终验证: proxy.php
header('Content-type:application/json');
$url=https://www.google.com/recaptcha/api/siteverify;
$response=POST['g_recaptcha_response'];
$secret=”“;/您可以在服务器端添加密钥
$params=array('secret'=>$secret,'response'=>$response);
$json=file_get_contents($url.'?secret='.$secret.&response='.$response);
echo$json;//这里应该是“真”或“假”
使现代化 为什么需要进一步验证google的siteverify URL

因为在第一次(用户)验证之后,只有谷歌知道用户是否是机器人。它用绿色勾号(或不勾号)更新reCaptcha框架,并创建隐藏的
g-reCaptcha-response
textarea标记,标记中包含返回但编码的值,但是您(服务器端的站点所有者)不知道用户是真是假。因此,无论是从textarea还是从callback输入参数,都可以使用该
g-recaptcha-response
值验证站点的当前用户(使用站点的密钥)。只在服务器端执行此操作,这样您就不会暴露密钥

如果有必要,可以不用PHP吗

当然,这是可以做到的。您只需向服务器发送
g-recaptcha-response
值,然后使用Java(或其他服务器工具)请求Google服务器验证站点(阅读文档)。然后在服务器端,您知道用户是否是机器人。使用任何技术将结果返回给客户端


您也可以从我的回复中获益。

非常感谢您的回复。在我们的案例中,我们没有提交传统意义上的报告;我们依靠DWR(AJAX)对用户的操作做出反应。在我们的例子中,reCAPTCHA正在调用我们的verifyCaptchaCallback函数,如前所述——但它只在用户成功通过挑战后才调用它——所以如果是这样的话,那么为什么需要进一步根据google的siteverify URL进行验证呢?如果有必要,可以不用PHP吗?ReCaptcha旨在防止机器人攻击。机器人甚至不需要使用你的前端,它可以直接调用你的后端,忽略你在前端做的任何检查。
var verifyCaptchaCallback = function(g_recaptcha_response) {
   console.log("Response validated.  Not a robot."); 
   // you can't do this now, since 'g_recaptcha_response' is an encoded value, neither true, nor false. 
}
header('Content-type: application/json');
$url=https://www.google.com/recaptcha/api/siteverify;
$response=POST['g_recaptcha_response'];
$secret = "<secter_key>"; // you add secret key server side
$params = array('secret'=> $secret, 'response'=> $response);
$json=file_get_contents( $url  . '?secret=' . $secret . '&response=' . $response);
echo $json; // here should be 'true' or 'false'