我一直收到我的reCAPTCHAvalidation请求上的“invalid-site-private-key”
也许你们可以帮助我。 我正在尝试在我的node.js应用程序中实现reCAPTCHA,无论我做什么,都会收到“invalid-site-private-key”作为响应。
这里是我加倍和检查和尝试的事情:
- 正确的钥匙
- 密钥不交换
- 键是“全局键”,因为我在本地主机上testing,认为这可能是一个问题
- 在服务器上的生产环境中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模块来解决这个问题。
但首先,要完成上面的缺失细节:
- 我没有使用任何模块,我的解决scheme完全是基于reCAPTCHA网站提供的文档自行编写的。
-
我没有发送任何请求标题,因为在文档中没有任何说明。 在他们解释必要的参数之前,关于请求的所有内容如下:
“在您的网页成功显示reCAPTCHA后,您需要configuration您的表单以检查用户input的答案是否正确,这可以通过向http://www.google.com/recaptcha/api/发送POST请求来实现validation ,下面是相关参数。“
– http://code.google.com/apis/recaptcha/docs/verify.html上的 “如何检查用户的答案”
所以我自己构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
使用这个,我可以看到我的私钥被破坏了。