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

flo*_*ger 9 post http recaptcha node.js

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

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

  1. 正确的钥匙
  2. 密钥不会被交换
  3. 键是"全局键",因为我在localhost上测试并认为它可能是一个问题
  4. 在服务器上的生产环境中测试 - 同样的问题

我能想到的最后一件事是我对reCAPTCHA API本身的POST请求是不正确的,因为没有明确记录正文的具体格式(我知道参数已记录).所以这是我正在发送的请求主体(密钥和IP已更改但我在我这边检查过):

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

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

谢谢您的帮助!

flo*_*ger 17

如上面的评论中所述,我可以通过https://github.com/mirhampt/node-recaptcha上提供的broofa和node-recaptcha模块帮助自己解决问题.

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

所以我自己构建了一个查询字符串(这是一个单行程序,但有一个模块,以及我现在学到的内容)包含所有参数并将其发送到reCAPTCHA API端点.我收到的只是错误代码invalid-site-private-key,实际上(正如我们现在所知)是一种错误的发送方式400 Bad Request.也许他们应该考虑实施这个,然后人们不会想知道他们的钥匙有什么问题.

这些是标题参数,显然是必要的(它们意味着你要发送一个表单):

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

我从node-recaptcha模块学到的另一件事是,应该发送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()
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

  • 我也遇到了这个问题,明确设置`Content-Type`标题为我工作,谢谢!(`Content-Length`已经由我的框架设置). (2认同)