如何在服务器调用中验证 recaptcha?

Posted

技术标签:

【中文标题】如何在服务器调用中验证 recaptcha?【英文标题】:How to verify recaptcha in server call? 【发布时间】:2017-10-12 15:23:31 【问题描述】:

情况:

我曾经用一个简单的表单来检查我的recaptcha,用POST提交到“/login”。

出于安全原因,我需要更改我的实现,并希望执行以下操作:

1) Jquery 表单提交。

2) 调用服务器以在服务器上调用 verify recaptcha。

3) 无需重新加载页面即可接收响应。

4) 根据响应是否接受登录请求。


问题:

看起来我可以发出 AJAX 请求?但我不知道怎么做。


客户代码:

<div class ="containerMargins">
        <h1 class = "authTitle">Login</h1>
        <form id="loginForm">
          <div class="form-group">
            <label>Email</label>
            <input type="email" class="form-control" name="email" id="loginEmail" placeholder="You can't forget it :)" required>
          </div>
          <div class="form-group">
            <label>Password</label>
            <input type="password" class="form-control" name="password" id="loginPassword" placeholder="We hope you didn't forget it ^^" required minlength="12">
          </div>
          <div class="g-recaptcha" data-sitekey="6LcRrxMUAAAAANx-AXSdRLAo4Pyqfqg-1vuPSJ5c"></div>
          <button class="btn btn-default" id="loginButton">Submit</button> <span class="userLinks">
          <a class="logLinks" href="/users/register">Register</a><a href="/users/password">Password?</a></span>
        </form>
    </div>

</div>

<% include ../partials/indexScripts %>

<script>

$("#loginForm").submit(function(e) 

    e.preventDefault(); 
    var email = $("#loginEmail").val();
    var password = $("#loginPassword").val();

    // WOULD LIKE TO MAKE SERVER CALL HERE TO CHECK RECAPTCHA BUT I DONT KNOW HOW

    $this = $(this);
    $.ajax(
        type: "POST",
        url: "users/register",
        data: $this.serialize()
    ).done(function(data) 

    if (successfulRecaptcha) 
          firebase.auth().signInWithEmailAndPassword(email, password ).then( authData => 
    
    else 
         console.log("You are a robot!");
    

服务器代码:

router.post('/login', function(req, res, next) 
    verifyRecaptcha(req.body["g-recaptcha-response"], function(success) 
        if (success) 

         else 

        
    );
);

【问题讨论】:

那个 NodeJS 在服务器上吗?你没有指定 @DannyZB 是的。是的。 【参考方案1】:

我找到了解决方案:

前端:

$this = $(this);
    $.ajax(
        type: "POST",
        url: "login",
        data: $this.serialize()
    ).done(function(data) 

        if (data == true) 

后端:

router.post('/login', function(req, res, next) 
    verifyRecaptcha(req.body["g-recaptcha-response"], function(success) 
        if (success) 
            res.send(true);
         else 
            res.send(false);
        
    );
);

【讨论】:

以上是关于如何在服务器调用中验证 recaptcha?的主要内容,如果未能解决你的问题,请参考以下文章

google recaptcha使用

如何在服务器端验证 Google reCAPTCHA v3?

Google reCAPTCHA:如何在服务器端获取用户响应和验证?

Google reCaptcha 2 TypeError:调用 grecaptcha.reset 后 a 为空

如何在Selenium python中使用reCaptcha2解决服务

在 ASP.NET 的服务器端验证 Recaptcha 2 (No CAPTCHA reCAPTCHA)