Google的reCAPTCHA v3

时间:2018-05-12 06:13:23

标签: javascript jquery recaptcha

我在html页面中使用Google的reCaptcha v3,它仍处于测试阶段。 (reCaptcha v3 docs

html页面由两个按钮组成,每个按钮都会导致使用jquery ajax调用后端Web服务方法,即单击这些按钮时不会提交表单。如果单击联系我们按钮,则会调用Web服务方法ContactUs,如果单击购买按钮,则会调用Web服务的Buy方法。

如果我在页面渲染后单击“联系我们”按钮,那么我会收到如下所示的响应,这是我所期望的,因为我不是机器人。

  

{success:true,challenge_ts:“2018-05-12T05:40:23Z”,主机名:“localhost”,得分:0.9}

然后,如果我点击另一个按钮,即购买按钮,我总会得到如下的回复。

  

{success:false,error-codes“:[”timeout-or-duplicate“]}

问题

当我点击“购买”按钮时,为什么recaptcha的响应总是为false,并且上面的错误消息是超时或重复?

我只是想确保机器人没有点击这些按钮,我认为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);
}

2 个答案:

答案 0 :(得分:2)

即使对于不同的令牌值,我也收到了同样的错误。我发现在验证后删除并重新添加api.js脚本到页面允许后续验证成功。

答案 1 :(得分:0)

您不应每页多次验证reCaptcha。这是不必要的,并且会产生多余的网络流量和过多的资源使用。

第一次验证后,您应将分数结果保存在服务器端(例如,作为会话变量),以备后用。