javascript - 什么是 Google 的 reCAPTCHA v3 中的重复或超时错误消息
问题描述
我在 html 页面中使用 Google 的 reCaptcha v3,它仍然是 beta 版本。(reCaptcha v3 文档)
html 页面由两个按钮组成,单击每个按钮会导致使用 jquery ajax 调用后端 Web 服务方法,即单击这些按钮时不会提交表单。如果单击“联系我们”按钮,则调用 Web 服务方法 ContactUs,如果单击“购买”按钮,则调用 Web 服务的“购买”方法。
如果我在页面呈现后单击“联系我们”按钮,则会收到如下响应,这是我所期望的,因为我不是机器人。
{成功:true,challenge_ts:“2018-05-12T05:40:23Z”,主机名:“localhost”,得分:0.9}
然后,如果我单击另一个按钮,即购买按钮,我总是会得到如下响应。
{成功:假,错误代码“:[“超时或重复”]}
问题
为什么当我点击购买按钮时,recaptcha 的响应总是错误的,上面显示超时或重复的错误消息?
我只是想确保机器人没有点击这些按钮,我认为 recaptcha v3 会对此有所帮助,但似乎整个页面需要回发,即每次点击按钮后都需要提交表单工作。
html代码
<!DOCTYPE html>
<html>
<head>
<title>reCaptcha v3</title>
<meta charset="utf-8" />
<script src="Scripts/jquery-1.11.3.min.js" type="text/javascript"></script>
<script src='https://www.google.com/recaptcha/api.js?render=keyValue'></script>
<script>
function verify(action) {
grecaptcha.execute('clientkeyValue')
.then(function (token) {
$.ajax({
type: "POST",
url: "SomeWebService.asmx/VerifyCaptchaV3",
data: JSON.stringify({ response: token }),
success: function (r) {
if (r && JSON.parse(r).success === true) {
verified = true;
if (action === "contactus") {
//code for calling ContactUs method in web service
} else if (action === "buy") {
//code for calling Buy method in web service
}
} else {
verified = false;
}
},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
});
}
</script>
</head>
<body>
<form action="javascript:grecaptcha.reset();" method="post">
<div id="example3"></div>
<br>
<input type="submit" value="Contact Us" id="submit" onclick="verify('contactus'); return false;">
<input type="submit" value="Buy" id="submit1" onclick="verify('buy'); return false;">
</form>
</body>
</html>
C#中的Web服务方法调用服务器端recaptcha siteVerify
public string VerifyCaptchaV3(string response) {
string url = "https://www.google.com/recaptcha/api/siteverify?secret=someValue&response=" + response;
return (new System.Net.WebClient()).DownloadString(url);
}
解决方案
即使对于不同的令牌值,我也收到相同的错误。我发现在验证后将 api.js 脚本删除并重新添加到页面可以使后续验证成功。
推荐阅读
- javascript - 从反应选择中清除值
- single-sign-on - 我如何为 ios 13 实现单点登录扩展
- json - Kusto KQL 引用 JSON 数组中的第一个对象
- ruby-on-rails - 如何使用 sidekiq 和 rails 应用程序生成每日报告?
- node.js - Jimp 及其缓冲区数据无法按预期使用 puppeteer 生成 PDF
- c++ - 将 C 与 C++ 连接起来
- javascript - 如何使用 Selenium-Webdriver for JavaScript 在 Chrome 中接受不安全的证书?
- visual-studio-code - 在 VSCode 中自动将关键字更改为大写
- r - Why ave results in error in unique.default?
- java - 从 Java 中获取大量 Mysql 数据