Я продолжаю получать "invalid-site-private-key" в моем запросе на проверку reCAPTCHA - PullRequest
9 голосов
/ 17 сентября 2011

Может быть, вы, ребята, можете помочь мне с этим. Я пытаюсь реализовать reCAPTCHA в моем приложении node.js и что бы я ни делал, я продолжаю получение "invalid-site-private-key" в качестве ответа.

Вот вещи, которые я дважды проверял и пробовал:

  1. Правильные ключи
  2. Ключи не меняются местами
  3. Ключи являются "глобальными ключами", так как я тестирую на localhost и подумал, что это может быть проблема с этим
  4. Протестировано в производственной среде на сервере - та же проблема

Последнее, что я могу вспомнить, это то, что мой POST-запрос к reCAPTCHA Сам 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 ]

17 голосов
/ 18 сентября 2011

Как указывалось в комментариях выше, я смог решить проблему самостоятельно с помощью broofa и модуля node-recaptcha, доступного по адресу https://github.com/mirhampt/node-recaptcha.

Но сначала, чтобы завершить пропущенноеподробности сверху:

  • Я не использовал ни одного модуля, мое решение полностью написано самостоятельно на основе документации, доступной по адресу на сайте reCAPTCHA .
  • Я не отправлял заголовки запросов, так как в документации ничего не было указано.Все, что сказано относительно запроса до того, как они объяснят необходимые параметры, является следующим:

    "После того, как ваша страница успешно отображает reCAPTCHA, вам необходимо настроить форму, чтобы проверить, соответствуют ли ответы, введенные пользователямиправильно. Это достигается с помощью запроса POST к http://www.google.com/recaptcha/api/verify. Ниже приведены соответствующие параметры. "

    - «Как проверить ответ пользователя» в http://code.google.com/apis/recaptcha/docs/verify.html

Итак, я сам построил строку запроса (которая состоит из одной строки, но есть модуль для этого, как я уже узнал), содержащий все параметры и отправляющий его в конечную точку API reCAPTCHA.Все, что я получил, это код ошибки 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()

Спасибо:)

2 голосов
/ 15 марта 2013

+ 1 к @florian за очень полезный ответ. Для потомков я подумал, что предоставлю некоторую информацию о том, как проверить, как выглядит ваш запрос капчи, чтобы помочь вам убедиться, что указаны соответствующие заголовки и параметры.

Если вы работаете на компьютере Mac или Linux или имеете локальный доступ к одному из них, вы можете использовать команду netcat для настройки быстрого сервера. Я предполагаю, что есть netcat windows ports , но у меня нет опыта работы с ними.

nc -l 8100

Эта команда создает TCP-сокет для прослушивания в поте 8100 и будет ожидать подключения. Затем вы можете изменить проверочный URL-адрес с 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

Используя это, я смог увидеть, что мой закрытый ключ был поврежден.

...