javascript - reCAPTCHA 2 是否需要 key ?

标签 javascript recaptcha verify

我刚刚开始尝试 Google 的 reCAPTCHA 工具/服务,但对其工作原理感到困惑。我已经按照 2.0 版本的指南进行操作,该版本似乎对我有用(在我的本地主机上) - 但我还没有必须使用 key 。仅当主机/域不是“localhost”时才需要 key 吗?

我们的网站依靠 DWR (AJAX) 而不是表单提交来与我们的后端交互,所以我希望必须以某种方式捕获用户的响应并将其发送到我们的 DWR java 方法,然后我将其发布到 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 会发送到 google,并且显然会返回一个失败/成功标志,导致 reCAPTCHA 要么提出另一个图像挑战,要么停止。我没有手动将结果发送到谷歌的验证服务网址 - 它似乎是自动发生的。这种行为是否只是因为我仍在使用“localhost”在我的开发人员系统上进行测试而发生 - 并且一旦 Web 应用程序移至我们的客户系统,该行为就会失败?

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

最佳答案

您确实需要验证用户点击。看看reCaptcha如何 works以及如何insert它。

no need to verify with google's service URL?

您仍需要使用 g_recaptcha_response 值进行验证。但你需要在服务器端进行!当表单提交到服务器时,您就有了。 在您的服务器上发布['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. 
}

在服务器上进行最终验证: 代理.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 文本区域标记,并在标记中返回但已编码的值,但是(网站所有者位于服务器端)不知道用户是真是假。因此,无论是来自文本区域还是来自回调输入参数,使用此 g-recaptcha-response 值,您都可以验证站点上的当前用户(使用站点的 key )。仅在服务器端执行此操作,这样您就不会泄露 key 。

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

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

您也可能会从我的 auto submit reCaptcha answer 中受益.

关于javascript - reCAPTCHA 2 是否需要 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33531697/

相关文章:

javascript - Recaptcha 导致部分页面加载

angular - 将 reCAPTCHA 与 Angular 4 集成的正确方法

java - 是否可以设置 Twilio 验证 api token 到期时间?

php - php 密码验证不匹配

javascript - Angular 4 - react 形式启用/禁用不起作用

javascript - 以不同的顺序输出数据

javascript - 将 ES6 插件扩展到 jQuery 原型(prototype)

javascript - 如何以编程方式将图片上传到 Facebook?

css - 覆盖 google recaptcha css 以使其响应

php - 在 PHP 中验证签名的 PDF 文档