2011-09-16 12 views
9

quizás ustedes puedan ayudarme con esto. Estoy tratando de implementar reCAPTCHA en mi aplicación node.js y no importa lo que haga, guardo obteniendo "invalid-site-private-key" como respuesta.Sigo recibiendo "invalid-site-private-key" en mi solicitud de validación de reCAPTCHA

Estas son las cosas que yo dobles y dobles comprobado e intentado:

  1. teclas correctas
  2. Las llaves no se intercambian
  3. Las claves son "claves globales", como yo estoy probando en el servidor local y pensé que podría ser un problema con que
  4. Probado en el entorno de producción en el servidor - mismo problema

lo último que se puede pensar es que mi solicitud de POST a la API reCAPTCHA es incorrecta ya que el formato concreto del cuerpo no está documentado explícitamente (los parámetros están documentados, lo sé). Por lo que este es el cuerpo de la petición Actualmente estoy enviando (la tecla e IP se cambia pero me hizo la revisión de mi lado):

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

¿Hay algo malo con este formato? ¿Tengo que enviar encabezados especiales ? ¿Estoy completamente equivocado? (Estoy trabajando durante 16 horas directamente ahora, así que esto podría ser ...)

¡Gracias por tu ayuda!

+0

No se han proporcionado suficientes detalles. ¿Cuáles son los encabezados de solicitud? ¿Estás usando un módulo como https://github.com/mirhampt/node-recaptcha? Tal vez intente volver a publicar cuando haya dormido un poco. : P – broofa

+0

Hola, broofa, disculpa que mi pregunta no haya sido suficiente para responderla. sin embargo, sin querer resolvió mi problema b/c en el módulo que postet los encabezados no documentados que son necesarios para verificar que se utiliza un reCAPTCHA, así que pude construirlos en mi propia solución. Voy a publicar la solución más tarde como una respuesta. ¡Gracias! ;) – floriankrueger

Respuesta

17

Como mencioné en los comentarios anteriores, pude resolver el problema yo mismo con la ayuda de broofa y el módulo node recaptcha disponible en https://github.com/mirhampt/node-recaptcha.

Pero en primer lugar, para completar los detalles que faltan desde arriba:

  • yo no utilizar cualquier módulo, mi solución es completamente auto-escrito sobre la base de la documentación disponible en the reCAPTCHA website.
  • No envié ningún encabezado de solicitud ya que no había nada indicado en la documentación. Todo lo que se dice sobre la solicitud antes de que se explican los parámetros necesarios es la siguiente:

    "Después de que su página está mostrando éxito reCAPTCHA, es necesario configurar el formulario para comprobar si las respuestas introducidas por los usuarios son correctas. Esto se logra haciendo una solicitud POST al http://www.google.com/recaptcha/api/verify. A continuación se muestran los parámetros relevantes ".

    - "Cómo comprobar la respuesta del usuario" en http://code.google.com/apis/recaptcha/docs/verify.html

Así que construyeron una cadena de consulta a mí mismo (que es una sola línea, pero hay una module para que así como he aprendido ahora) que contiene todos los parámetros y lo envió al punto final de la API reCAPTCHA. Todo lo que recibí fue el código de error invalid-site-private-key, que en realidad (como sabemos hasta ahora) es una forma incorrecta de realmente enviar un 400 Bad Request. Tal vez deberían pensar en implementar esto, entonces la gente no se preguntaría qué pasa con sus llaves.

Estos son los parámetros de cabecera que son obviamente necesarios (que implican que va a enviar un formulario):

  • Content-Length que tiene que ser la longitud de la cadena de consulta
  • Content-Type que tiene que ser application/x-www-form-urlencoded

Otra cosa que aprendí del módulo node-recaptcha es, que se debe enviar la cadena de consulta codificada utf8.

Mi solución ahora se ve así, puede usarla o acumularse en ella, pero el manejo de errores aún no está implementado. Y está escrito en 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() 

Gracias :)

+2

Me encontré con este problema también, estableciendo explícitamente el encabezado 'Content-Type' trabajado para mí, ¡gracias! ('Content-Length' ya fue establecido por mi framework). – Halcyon

+1

Menciona que los datos deben estar codificados como 'utf8'. Estoy usando una implementación basada en PHP e incluso en el código de la biblioteca original (v1.11) no puedo encontrar ninguna mención de esto. La implementación original usa '$ key." = ". urlencode (stripslashes ($ value)) 'pero estoy bastante seguro de que' http_build_query' es una alternativa superior, creo que optaron por no usarlo para seguir siendo compatibles con PHP 4.x. En la implementación original 'node-recaptcha'' res.setEncoding ('utf8') 'no está incluido, ¿lo agregó usted mismo? – Halcyon

+0

Tienes razón, no hay 'res.setEncoding ('utf8')' en node recaptcha pero si con cuidado todo el camino hasta [línea 151] (https://github.com/mirhampt/node-recaptcha /blob/master/lib/recaptcha.js#L151) ves que la respuesta finalmente se escribe en la secuencia de salida en codificación utf-8. Realmente no sé si esto es crucial, pero lo incluí en mi solución y funcionó. – floriankrueger

2

1 a @florian por la respuesta muy útiles. Para la posteridad, pensé en proporcionar algo de información sobre cómo verificar cómo se ve tu solicitud de captcha para ayudarte a asegurarte de que se especifican los encabezados y parámetros apropiados.

Si está en una máquina Mac o Linux o tiene acceso a una de ellas localmente, puede usar el comando netcat para configurar un servidor rápido. Supongo que hay netcat windows ports pero tengo no experiencia con ellos.

nc -l 8100 

Este comando crea un socket TCP que escucha en el pote 8100 y esperará una conexión. A continuación, puede cambiar la URL de captcha verify de http://www.google.com/recaptcha/... en el código del servidor para que sea http://localhost:8100/. Cuando el código hace que el POST para verificar la URL debe consultar a su solicitud de salida hacia el pedregal por 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 

uso de este, pude ver que mi clave privada se corrompió.

Cuestiones relacionadas