我一直在我的reCAPTCHA验证请求上收到“invalid-site-private-key”

时间:2011-09-16 21:15:52

标签: http post node.js recaptcha

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

以下是我加倍检查和尝试的内容:

  1. 正确的钥匙
  2. 未交换密钥
  3. 当我在localhost上测试时,键是“全局键”,并认为它可能是一个问题
  4. 在服务器上的生产环境中测试 - 同样的问题
  5. 我能想到的最后一件事是我对reCAPTCHA的POST请求 API本身是不正确的,因为身体的具体格式不是 明确记录(参数记录,我知道)。所以这 是我正在发送的请求正文(密钥和IP已更改 但我在他身边查了一下):

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

    这种格式有问题吗?我必须送特别的吗? 头?我完全错了吗? (我连续工作了16个小时 现在这可能是..)

    感谢您的帮助!

2 个答案:

答案 0 :(得分:17)

如上面的评论中所述,我能够借助于broofa和https://github.com/mirhampt/node-recaptcha提供的节点重新获取模块来解决问题。

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

  • 我没有使用任何模块,我的解决方案完全是根据the reCAPTCHA website提供的文档自行编写的。
  • 我没有发送任何请求标头,因为文档中没有任何说明。在解释必要参数之前,关于请求的所有内容如下:

      

    “页面成功显示reCAPTCHA后,您需要配置表单以检查用户输入的答案是否正确。这是通过向http://www.google.com/recaptcha/api/verify发出POST请求来实现的。以下是相关参数“。

    - “{3}}

  • 上的”如何查看用户的答案“

所以我自己构建了一个查询字符串(这是一个单行程序,但是我现在已经知道了http://code.google.com/apis/recaptcha/docs/verify.html)包含所有参数并将其发送到reCAPTCHA API端点。我收到的只是错误代码invalid-site-private-key,实际上(正如我们现在所知)实际上是发送400 Bad Request的错误方法。也许他们应该考虑实施这个,然后人们不会想知道他们的钥匙有什么问题。

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

  • Content-Length必须是查询字符串的长度
  • Content-Type必须为application/x-www-form-urlencoded

我从module模块学到的另一件事是,应该发送编码的utf8编码。

我的解决方案现在看起来像这样,您可以使用它或在其上构建,但错误处理尚未实现。它是用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 :(得分:2)

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

如果您使用的是Mac或Linux计算机,或者可以在本地访问其中一台计算机,则可以使用netcat命令设置快速服务器。我猜有netcat windows ports,但我有没有经验。

nc -l 8100

此命令创建一个监听pot 8100的TCP套接字,并等待连接。然后,您可以将服务器代码中http://www.google.com/recaptcha/...的验证码验证网址更改为http://localhost:8100/。当您的代码将POST发送到验证网址时,您应该会看到您的请求通过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

使用此功能,我能够看到我的私钥已损坏。