谷歌的recaptcha api无效input秘密

我试图在我的网站上使用recaptcha。 具有快速框架的Nodejs服务器。 该网站没有托pipe,我仍然在本地工作。 在主页上,当用户input他的信息来创build一个帐户,并解决recaptcha,我发送结果

$("#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); } }); }); 

关键是答复,秘密是他们给你的秘密钥匙。 我声明了一个variablesSECRET,并将密钥存储为一个string。

每一次,为了

 console.log(parsedData); 

这是说

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

我复制并粘贴了密钥,怎么可能是无效的? 它只是应该显示这个错误,如果“秘密参数是无效的或畸形”,因为它在他们的网站上说。 我遵循这个教程 。

我也跟着教程,然后碰到你在这里报告的同样的错误。 仔细查看教程中的屏幕截图

用这些参数发送GET请求 在这里输入图像描述

并检查谷歌reCaptcha 网站它说

用这些参数发送POST请求 在这里输入图像描述

我很好奇Google是否改变了关于POST而不是GET的想法,或者本教程中的截图来自不同的来源。

无论如何,我已经调整了教程中的代码版本,使POST请求(下面的代码使用querystring模块),请参阅下面:

 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 问题 。

如果你正在开发,你厌倦了所有棘手的着名和最令人讨厌的街道名称reCaptcha ,那么我build议你使用Google提供的testingSiteSecret keys来覆盖captcha解决,以加快发展。 看到这里

这真的很愚蠢,我不敢相信我浪费了这么多时间,但不是使用variablesSECRET,而是将我的密钥添加到了URL中,并且工作。