我一直收到我的reCAPTCHAvalidation请求上的“invalid-site-private-key”

也许你们可以帮助我。 我正在尝试在我的node.js应用程序中实现reCAPTCHA,无论我做什么,都会收到“invalid-site-private-key”作为响应。

这里是我加倍和检查和尝试的事情:

  1. 正确的钥匙
  2. 密钥不交换
  3. 键是“全局键”,因为我在本地主机上testing,认为这可能是一个问题
  4. 在服务器上的生产环境中testing – 同样的问题

我能想到的最后一件事是我的POST请求reCAPTCHA API本身是不正确的,因为具体格式的身体没有明确logging(参数logging,我知道)。 所以这是我目前正在发送的请求主体(密钥和IP被更改,但是我检查了他们):

privatekey=6LcHN8gSAABAAEt_gKsSwfuSfsam9ebhPJa8w_EV&remoteip=10.92.165.132& challenge=03AHJ_Vuu85MroKzagMlXq_trMemw4hKSP648MOf1JCua9W-5R968i2pPjE0jjDGX TYmWNjaqUXTGJOyMO3IKKOGtkeg_Xnn2UVAfoXHVQ-0VCHYPNwrj3PQgGj22EFv7RGSsuNfJCyn mwTO8TnwZZMRjHFrsglar2zQ&response=Coleshill areacce

这种格式有什么问题吗? 我必须发送特殊的标题吗? 我完全错了吗? (我现在正在连续工作16个小时,所以这可能是..)

感谢您的帮助!

正如上面的评论所述,我可以通过broofa和https://github.com/mirhampt/node-recaptcha上提供的node-recaptcha模块来解决这个问题。

但首先,要完成上面的缺失细节:

所以我自己构build了一个查询string(这是一个单线程,但有一个模块 ,以及我现在学到的)包含所有参数,并将其发送到reCAPTCHA API端点。 我收到的全部是错误代码invalid-site-private-key ,实际上(正如我们现在所知),实际上是发送一个400 Bad Request的错误方法。 也许他们应该考虑实施这个,那么人们不会怀疑他们的钥匙有什么问题。

这些是显然必要的标题参数(它们暗示你正在发送一个表单):

  • Content-Length必须是查询string的长度
  • Content-Type必须是application/x-www-form-urlencoded

我从node-recaptcha模块学到的另一件事是,应该发送查询stringutf8编码。

我的解决scheme现在看起来像这样,你可以使用它或build立它,但error handling尚未实现。 它是用CoffeeScript编写的。

 http = require 'http' module.exports.check = (remoteip, challenge, response, callback) -> privatekey = 'placeyourprivatekeyhere' request_body = "privatekey=#{privatekey}&remoteip=#{remoteip}&challenge=#{challenge}&response=#{response}" response_body = '' options = host: 'www.google.com' port: 80 method: 'POST' path: '/recaptcha/api/verify' req = http.request options, (res) -> res.setEncoding 'utf8' res.on 'data', (chunk) -> response_body += chunk res.on 'end', () -> callback response_body.substring(0,4) == 'true' req.setHeader 'Content-Length', request_body.length req.setHeader 'Content-Type', 'application/x-www-form-urlencoded' req.write request_body, 'utf8' req.end() 

谢谢 :)

+1给@florian非常有帮助的答案。 对于后代,我想我会提供一些有关如何validation您的validation码请求的信息,以帮助您确保指定相应的标题和参数。

如果您在Mac或Linux计算机上或者有权访问其中一个本地,则可以使用netcat命令来设置快速服务器。 我想有netcat窗口端口,但我没有与他们的经验。

 nc -l 8100 

这个命令创build一个在8100上监听的TCP套接字,并等待连接。 然后,您可以将http://www.google.com/recaptcha/...中的validation码validationurl更改为http://localhost:8100/ 。 当您的代码将POST发送到validationURL时,您应该看到您的请求被netcat输出到scree:

 POST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 277 Host: localhost:8100 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1 (java 1.5) privatekey=XXX&remoteip=127.0.0.1&challenge=03AHJYYY...&response=some+words 

使用这个,我可以看到我的私钥被破坏了。