reCAPTCHA 2 是否需要密钥?

Is secret key required for reCAPTCHA 2?

我刚刚开始尝试使用 Google 的 reCAPTCHA tool/service,但对它的工作原理感到困惑。我已经遵循了 2.0 版本的指南,它似乎对我有用(在我的本地主机上)——但我还没有必须使用密钥。只有在 host/domain 不是 "localhost" 时才需要密钥吗?

我们的网站依赖于 DWR (AJAX) 而不是表单提交来与我们的后端进行交互,所以我期望必须以某种方式捕获用户的响应并将其发送到我们的 DWR java然后我 POST 将其发送到 Google 的验证服务 URL 的方法。不过我似乎不需要那样做。

我已将这些添加到我的 jsp 主文件中:

<script src='https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit' async defer></script>
...
<div id="captchaDiv"></div>

然后我添加的 java脚本是:

var onloadCaptchaCallback = function() {
   grecaptcha.render('captchaDiv', {
     'sitekey' : 'MYSITEKEY',
     'callback' : verifyCaptchaCallback
 });
}

var verifyCaptchaCallback = function(g_recaptcha_response) {
   console.log("Response validated.  Not a robot.");
   // thought I would need to add DWR (AJAX) call here to verify the response
   // but this callback is only getting called on a successful response
   // anyway - so no need to verify with google's service URL? 
}

并且仅当用户满足挑战时才会调用 verifyCaptchaCallback 函数。我还没有使用密钥。我错过了什么吗?或者这是版本 2 的预期工作方式 - 无需服务器端处理?我看到当我单击挑战图像对话框上的验证按钮时,POST 被发送到 google,显然 returns 带有 fail/succeed 标志,导致 reCAPTCHA要么提出另一个形象挑战,要么停止。我没有手动将结果发送到 google 的验证服务 URL - 它似乎是自动发生的。这种行为是否只是因为我仍在使用 "localhost" 在我的开发人员系统上进行测试而发生 - 一旦将 webapp 移至我们的客户系统,该行为就会失败?

感谢您提供的任何说明。 格雷戈尔

您确实需要验证用户点击。看看reCaptcha如何works and how to insert吧。

no need to verify with google's service URL?

您仍然需要使用 g_recaptcha_response 值进行验证。但是你需要在服务器端做!当表单提交到服务器时,您有 ex。 POST['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 = "<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' 

更新

why is a further step to verify against google's siteverify URL necesssary?

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

If it is necessary - could it be done without PHP?

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

你也可能从我的 中受益。