reCAPTCHA 2需要密钥吗?

时间:2015-11-04 20:47:40

标签: javascript recaptcha verify

我刚刚开始尝试使用Google的reCAPTCHA工具/服务,并对它的工作方式感到困惑。我已经按照2.0版本的指南进行了操作,这个版本似乎对我有用(在我的本地主机上) - 但我还没有使用密钥。只有在主机/域不是" localhost"?时才需要密钥。

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

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

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

然后我添加的javascript是:

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被发送到谷歌并且显然返回失败/成功标志,导致reCAPTCHA呈现另一个图像质询或停止。我没有手动将结果发送到Google的验证服务网址 - 它似乎是自动发生的。这种行为是否只发生,因为我仍在使用&#34; localhost&#34;在我的开发者系统上进行测试。 - 一旦将webapp移动到我们的客户系统,行为就会失败?

感谢您提供的任何澄清。 格里

1 个答案:

答案 0 :(得分:1)

您需要验证用户点击次数。了解reCaptcha works以及如何insert

  

无需使用Google的服务网址进行验证?

您仍需要使用g_recaptcha_response值进行验证。但你需要在服务器端做它!当表单提交到服务器时,你有ex。您服务器上的POST['g_recaptcha_response']

var verifyCaptchaCallback = function(g_recaptcha_response) {
   console.log("Response validated.  Not a robot."); 
   // you can't now it yet, since 'g_recaptcha_response' is an encoded value, not true or 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' 

更新

  

为什么需要进一步验证google的siteverify网址是否必要?

因为在第一次(用户)验证后,只有Google知道用户是否是机器人。它使用绿色勾选(或不更新)更新reCaptcha框架,并在标签中创建隐藏的g-recaptcha-response textarea标签,其中包含(服务器端的网站所有者)如果用户是真或假,则不知道。因此,使用此g-recaptcha-response值无论是来自textarea还是来自回调输入参数,您都可以验证您网站上的当前用户(使用网站的密钥)。只做服务器端,这样你就不会暴露秘密密钥。

  

如果有必要 - 可以在没有PHP的情况下完成吗?

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

您也可以从我的auto submit reCaptcha answer中受益。