google的recaptcha api的无效输入密码

时间:2015-08-23 11:14:08

标签: node.js post get recaptcha

我正在尝试在我的网站上使用recaptcha。 Nodejs服务器带有快速框架。该网站没有托管,我仍在本地工作。在主页上,在用户输入他的信息以创建帐户并解决重新接收后,我发送结果

$("#g-recaptcha-response").val()

到服务器。在我的服务器上,

https.get("https://www.google.com/recaptcha/api/siteverify?secret=" + SECRET + "&response=" + key, function(res) {
            var data = "";
            res.on('data', function (chunk) {
                    data += chunk.toString();
            });
            res.on('end', function() {
                    try {
                            var parsedData = JSON.parse(data);
                            console.log(parsedData);
                            callback(parsedData.success);
                    } catch (e) {
                            callback(false);
                    }
            });
    });

其中key是响应,SECRET是他们给你的密钥。我宣布了 变量SECRET并将密钥存储为其中的字符串。

每次都是

console.log(parsedData); 

这是说

{ success: false, 'error-codes': [ 'invalid-input-secret' ] }

我复制并粘贴了密钥,怎么可能无效。如果“秘密参数无效或格式错误”,它只应显示此错误,如同website所述。我遵循了tutorial

2 个答案:

答案 0 :(得分:2)

我也遵循了教程,然后碰到了你在这里报告的相同错误。仔细查看tutorial显示的屏幕截图

发送包含这些参数的GET请求 enter image description here

并检查Google reCaptcha website它说

发送包含这些参数的POST请求 enter image description here

我很好奇Google是否改变了对POST而不是GET的看法,或者教程中的屏幕截图来自不同的来源。

无论如何,我已经调整了教程中的代码版本以发出POST请求(下面代码使用查询字符串模块),见下文:

var SECRET = "YourSecretHere";

// Helper function to make API call to recatpcha and check response
function verifyRecaptcha(key, callback) {
  //declare above var querystring = require('querystring') on top
  var post_data = querystring.stringify({
    'secret' : SECRET,
    'response': key
  });

  var post_options = {
    host: 'www.google.com',
    port: '443',
    method: 'POST',
    path: '/recaptcha/api/siteverify',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': Buffer.byteLength(post_data)
    }
  };
  var req = https.request(post_options, function(res) {
    var data = "";
    res.on('data', function (chunk) {
      data += chunk.toString();
    });
    res.on('end', function() {
      try {
        var parsedData = JSON.parse(data);
        callback(parsedData.success);
      } catch (e) {
        callback(false);
      }
    });
  });
  req.write(post_data); 
  req.end();
  req.on('error',function(err) {
    console.error(err);
  });
}

我还想补充一点, remoteip 字段是可选的,但是,如果您也需要,也可以传递该值。为此,您需要从连接对象中检索remoteIpAddress,或者只需在您的应用上启用信任代理,如下所示:

app.enable('trust proxy'); 

然后将ip地址传递给 verifyRecaptcha ,调用如下:

verifyRecaptcha(req.ip, req.body["g-recaptcha-response"], function(success) {
   if(success) { ...} else { ... } 
}); 

然后,您需要修改post_params以包含 remoteip 字段,如下所示:

var post_data = querystring.stringify({
    'secret' : SECRET,
    'response': key,
    'remoteip': ip
  });

app.enable('trust proxy');允许req.ipreq.ips这是一个ip地址数组。有关获取请求的IP地址的详细信息,请参阅此SO question

如果您正在开发并且厌倦了所有棘手的着名且最烦人的Street Names reCaptcha,那么我建议您使用Google提供的测试SiteSecret keys来覆盖验证码解决方案以加快开发速度。见here

答案 1 :(得分:0)

这真是太愚蠢了,我不敢相信我浪费了这么多时间,但是我没有使用变量SECRET,而是将我的密钥添加到网址中并且它有效。