Http “我一直收到”;无效的站点私钥“;关于我的reCAPTCHA验证请求

Http “我一直收到”;无效的站点私钥“;关于我的reCAPTCHA验证请求,http,post,node.js,recaptcha,Http,Post,Node.js,Recaptcha,也许你们可以帮我。我正在努力实施 在我的node.js应用程序中重新调用TCHA,无论我做什么,我都会 获取“无效站点私钥”作为响应 以下是我反复检查和尝试过的东西: 正确的键 密钥不能交换 键是“全局键”,因为我正在本地主机上测试,并认为这可能是一个问题 在服务器上的生产环境中测试-相同的问题 我所能想到的最后一件事是,我对reCAPTCHA的POST请求 API本身是不正确的,因为主体的具体格式不正确 明确记录(我知道参数已记录在案)。那么这个 是我当前发送的请求正文(密钥和IP已更改 但我

也许你们可以帮我。我正在努力实施 在我的node.js应用程序中重新调用TCHA,无论我做什么,我都会 获取“无效站点私钥”作为响应

以下是我反复检查和尝试过的东西:

  • 正确的键
  • 密钥不能交换
  • 键是“全局键”,因为我正在本地主机上测试,并认为这可能是一个问题
  • 在服务器上的生产环境中测试-相同的问题
  • 我所能想到的最后一件事是,我对reCAPTCHA的POST请求 API本身是不正确的,因为主体的具体格式不正确 明确记录(我知道参数已记录在案)。那么这个 是我当前发送的请求正文(密钥和IP已更改 但我在我这边检查过了):

    privatekey=6chn8gsaabaaet\gkswfusfsam9ebhpja8w\u EV&remoteip=10.92.165.132&challenge=03AHJ\u vu885mrokzagmlxq\u trMemw4hKSP648MOf1JCua9W-5r968i2ppje0jjjdgx tymwnjaqujjoymo3ikkogtkeg\n2uvafoxhvq-0vq-0vcHypnw3pqgggj22efv7rgssunfv7fvzyn-mwtozjjjjjjjjjjjjjjjf7frzq&response=Coleshill>

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


    谢谢你的帮助

    如上面的评论所述,在broofa的帮助下,我自己解决了这个问题,并且在上提供了node recaptcha模块

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

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

      页面成功显示reCAPTCHA后,您需要配置表单,以检查用户输入的答案是否正确。这是通过向进行POST请求来实现的。以下是相关参数

      --“如何检查用户的答案”位于

    因此,我自己构建了一个包含所有参数的querystring(这是一个单行程序,但正如我现在所了解的那样,它有一个用于此的查询字符串),并将其发送到reCAPTCHA API端点。我收到的只是错误代码
    无效的站点私钥
    ,这实际上(正如我们现在所知道的)是发送
    400错误请求的错误方式
    。也许他们应该考虑实现这一点,这样人们就不会怀疑他们的钥匙出了什么问题

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

    • 内容长度
      必须是查询字符串的长度
    • 内容类型
      必须是
      应用程序/x-www-form-urlencoded
    我从模块中学到的另一件事是,应该发送querystring
    utf8
    encoded

    我的解决方案现在看起来是这样的,您可以使用它或在它的基础上构建它,但错误处理尚未实现。而且是用咖啡脚本写的

    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,以获得非常有用的答案。为了子孙后代,我想我应该提供一些关于如何验证captcha请求的信息,以帮助您确保指定了适当的头和参数

    如果您在Mac或Linux机器上,或者可以在本地访问其中一个,则可以使用netcat命令设置快速服务器。我想有,但我没有经验

    nc -l 8100
    
    此命令在pot 8100上创建一个侦听TCP套接字,并将等待连接。然后,您可以从
    http://www.google.com/recaptcha/...
    在您的服务器中,代码为
    http://localhost:8100/
    。当您的代码将
    POST
    发送到验证URL时,您应该会看到netcat将您的请求输出到屏幕:

    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
    

    使用此工具,我可以看到我的私钥已损坏。

    没有提供足够的详细信息。请求头是什么?您是否使用类似的模块?也许你睡过觉后再发邮件PHey broofa,很抱歉我的问题不足以回答。尽管如此,您无意中在模块中解决了我的问题b/c。您在模块中发布了验证是否使用了reCAPTCHA所需的未记录头,因此我能够将它们构建到我自己的解决方案中。我稍后会将解决方案作为答案发布。谢谢!;)我也遇到了这个问题,显式地设置
    内容类型
    标题对我很有效,谢谢!(
    Content Length
    已由我的框架设置)。您提到数据必须是
    utf8
    编码的。我使用的是基于PHP的实现,即使在原始库代码(v1.11)中,我也没有提到这一点。最初的实现使用
    $key.“=”。urlencode(stripslashes($value))
    但我很确定
    http\u build\u query
    是一个更好的选择,我猜他们选择不使用它来保持与PHP4.x的兼容性。在原始的
    节点recaptcha
    实现中
    res.setEncoding('utf8')
    不包括在内,您自己添加了这个吗?没错,没有
    res.setEncoding('utf8'))
    在node recaptcha中,但如果您一直仔细地往下看,您会发现响应最终以utf-8编码写入输出流。我真的不知道这是否重要,但我将其包含在我的解决方案中,它成功了。您可以使用superagent()发出请求,在这种情况下,您只需要指定
    内容类型