Google reCaptcha无法正常工作

时间:2018-08-22 17:58:15

标签: javascript json recaptcha invisible-recaptcha

我正在写这封信,是因为该网站上的任何问题都无法真正帮助我弄清楚为什么reCaptcha没有得到验证。我在页面上使用了两个reCaptcha的V2和Invisible。不幸的是,我正在使用的项目非常老,虽然看起来像是ASP.NET MVC,但我看不到任何控制器或模型,因此我不知道它的真正写法。 ASP.NET WebForms中的项目,并且reCaptcha可以完美地工作。问题是我必须在旧站点上使用JavaScript,直到发布新站点为止,而新站点将不再使用几个月。

这是我的表格:

<form id="form" action="?" method="post">
<fieldset>

    <div class="form-group">
        <div class="row">
            <div class="col-md-12">

                @* RECAPTCHA V2 WIDGET *@
                <div id="captcha2" class="g-recaptcha"
                     data-sitekey="6LdOZWkUAAAAAE1EhMyhMPF5IwM3lflaeyZ2VWaB"></div>
                <br />
                @* MESSAGE FROM RECAPTCHA *@
                <div id="msg" class="msg-error error"></div>
                <br>
                @* SUBMIT BUTTON FOR VALIDATION & RECAPTCHA *@
                <input id="submit" type="submit" name="buttonSubmit" class="btn btn-success btn-large"
                       value="Submit Information Request" />
                <input type="hidden" name="registerDate" value="@DateTime.Now" />
            </div>
        </div>
    </div>

    @* RECAPTCHA INVISIBLE WIDGET *@
    <div id="captchaI" class="g-recaptcha"
         data-sitekey="6LduaWkUAAAAAHp0EU5JXdTIszKR-g2AZfDqmLiv"
         data-callback="submit"
         data-size="invisible">
    </div>
</fieldset>

这是我的JavaScript:

<script>
$('#submit').click(function () {
    //var obj =
    //{
    //    secret: "MY_PRIVATE_KEY",
    //    response: grecaptcha.getResponse()
    //};
    //var json = JSON.stringify(obj);
    //window.location = "https://www.google.com/recaptcha/api/siteverify?" + json;

    //var respJSON = '{"success": true | false, "challenge_ts": timestamp, "hostname":string}';
    //var respObj = JSON.parse(respJSON);
    //alert(respObj.success + "\n" + respObj.challenge_ts + "\n" + respObj.hostname);

    //--------------------------------------------------------------------

    alert("NO JSON\n" + grecaptcha.getResponse()); //I GET A HASHED RESPONSE

    var response = grecaptcha.getResponse();
    var stringy = JSON.stringify("STRINGIFY\n" + response);
    alert(stringy); //I GET A HASHED RESPONSE
    var parsy = JSON.parse("PARSED" + response);
    alert(parsed);  //I GET NOTHING

    //--------------------------------------------------------------------

    //var pk = 'MY_PRIVATE_KEY';
    //var url = "https://www.google.com/recaptcha/api/siteverify?secret=";
    //$.post(url,
    //    {
    //        "secret": pk,
    //        "response": "&response=" + response
    //    },
    //    function (response) {
    //        alert(response);
    //    });

    //alert(response);
    //JSON.stringify(response);
    //alert(response);
    //$('#msg').prepend(response);
    //if (!response) {
    //    $('#msg').text("No Response from Captcha.");
    //}
});

如您所见,我正在将jQuery与JSON结合使用。我试图以多种方式从reCaptcha中获取响应,通常在#msg div中发布消息,但在那里什么都没有显示。

我知道Google Developers reCaptcha Guide是什么 说,但实际上如何实现它没有帮助。请提供帮助,因为没有其他解决方案可以通过siteverify验证响应,使用由于代理人的控制而无法使用的PHP,或者像《开发人员指南》一样没有帮助。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试验证响应客户端。那行不通。 Google仅会验证您向他们注册的网址发送的响应。因此,您需要验证响应服务器端。

首先,从小部件中获取哈希代码

addresses = [['123 street name', 'New Orleans', 'LA', 12345],['New Orleans', 'LA', 12345]]

for address in addresses:
    if len(address) > 3:
        street = address[0]
        city = address[1]
        city = city.lstrip()
        state = address[2]
        state = state.lstrip()
        zip_code = address[3]
    else:
        street = "-"
        city = address[0]
        city = city.lstrip()
        state = address[1]
        state = state.lstrip()
        zip_code = address[2]

下一步,将响应发送到您的服务器。

var captchaResponse = window.grecaptcha.getResponse();
if (captchaResponse === "") {
    alert("Please check \"I'm not a robot'\"");
    return;
}

出于我的目的,我需要发布跨网域。您可能可以删除crossDomain参数。

然后,这是我处理帖子的终点。根据您的项目状态,您可能需要为此使用经典的ASP.NET表单。

$.ajax({
    type: "POST",
    url: newRequestUrl,
    crossDomain: true,
    xhrFields: {
        withCredentials: false
    },
    data: {
        request: JSON.stringify(request),
        recaptchaResponse: recaptchaResponse
    },
    error: function (x1, x2, x3, x4) {
        alert("Error: unable to process request");
        window.grecaptcha.reset();
    },
    success: function (respose) {
        window.grecaptcha.reset();

        alert("Request received");
    }
});

最后,确认响应。

    [AllowAnonymous]
    public JsonResult NewRequest(string request, string recaptchaResponse)
    {
        if (VerifyRecaptchaResponse(recaptchaResponse, Request.UserHostAddress) == false)
        {
            return Json(new { Error = "Invalid reCAPTCHA response" });
        }

        return Json(true);
    }

希望这会有所帮助。