2011-09-16 15 views
9

forse voi ragazzi potete aiutarmi con questo. Sto cercando di implementare reCAPTCHA nella mia applicazione node.js e non importa cosa faccio, tengo ottenendo "invalid-site-private-key" come risposta.Continuo a ricevere "invalid-site-private-key" sulla mia richiesta di conferma reCAPTCHA

Qui ci sono le cose che doppie e ricontrollato e provato:

  1. tasti corretti
  2. Le chiavi non sono scambiati
  3. Le chiavi sono "chiavi globali" come sto testando su localhost e ho pensato che potrebbe essere un problema con che
  4. Testato in ambiente di produzione sul server - lo stesso problema

l'ultima cosa che si può pensare che la mia richiesta POST all'API reCAPTCHA non sia corretta in quanto il formato concreto del corpo non è esplicitamente documentato (i parametri sono documentati, lo so). Quindi questo è il corpo della richiesta Attualmente sto mando (la chiave e IP sia cambiato ma li ho controllato il mio lato):

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

C'è qualcosa di sbagliato in questo formato? Devo inviare intestazioni speciali ? Ho completamente torto? (Sto lavorando per 16 ore direttamente ora così potrebbe essere ..)

Grazie per il vostro aiuto!

+0

Numero insufficiente fornito. Quali sono le intestazioni delle richieste? Stai usando un modulo come https://github.com/mirhampt/node-recaptcha? Forse prova a ripostare quando hai dormito un po '. : P – broofa

+0

Hey broofa, mi dispiace che la mia domanda non sia stata sufficiente per rispondere. ciononostante hai involontariamente risolto il mio problema b/c nel modulo che hai postato gli header non documentati che sono necessari per verificare che vengano usati reCAPTCHA, quindi sono stato in grado di costruirli nella mia soluzione. Invierò la soluzione più tardi come risposta. Grazie! ;) – floriankrueger

risposta

17

Come indicato nei commenti sopra, sono stato in grado di risolvere il problema me stesso con l'aiuto di broofa e del modulo nodo-recaptcha disponibile allo https://github.com/mirhampt/node-recaptcha.

Ma in primo luogo, per completare i dettagli mancanti dall'alto:

  • non ho usato alcun modulo, la mia soluzione è completamente auto-scritta sulla base della documentazione disponibile presso the reCAPTCHA website.
  • Non ho inviato alcuna intestazione di richiesta in quanto non è stato indicato nulla nella documentazione. Tutto ciò che viene detto, riguardante la richiesta prima che spiegano i parametri necessari è la seguente:

    "Dopo che la pagina viene visualizzato correttamente reCAPTCHA, è necessario configurare il modulo per verificare se le risposte inserite dagli utenti sono corrette. Ciò si ottiene facendo una richiesta POST a http://www.google.com/recaptcha/api/verify. Di seguito sono riportati i parametri rilevanti. "

    - "Come controllare risposta per l'utente" a http://code.google.com/apis/recaptcha/docs/verify.html

Così ho costruito un querystring me stesso (che è un one-liner, ma c'è un module per questo così come ho imparato ora) contenente tutti i parametri e inviato all'endpoint API reCAPTCHA. Tutto quello che ho ricevuto è stato il codice di errore invalid-site-private-key, che in realtà (come sappiamo ormai) è un modo sbagliato di inviare veramente uno 400 Bad Request. Forse dovrebbero pensare a implementare questo, quindi la gente non si chiederà cosa c'è che non va nelle loro chiavi.

Questi sono i parametri di intestazione che sono ovviamente necessarie (implicano che si sta inviando un modulo):

  • Content-Length che deve essere la lunghezza della stringa di query
  • Content-Type che deve essere application/x-www-form-urlencoded

Un'altra cosa che ho imparato dal modulo node-recaptcha è, che si dovrebbe inviare il querystring utf8 codificato.

La mia soluzione ora è simile a questa, è possibile utilizzarla o crearla ma la gestione degli errori non è ancora stata implementata. Ed è scritto in 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() 

Grazie :)

+2

Mi sono imbattuto in questo problema, impostando esplicitamente l'intestazione 'Content-Type' per me, grazie! ('Content-Length' era già impostato dal mio framework). – Halcyon

+1

Hai detto che i dati devono essere codificati con 'utf8'. Sto usando un'implementazione basata su PHP e anche nel codice della libreria originale (v1.11) non riesco a trovarlo. L'implementazione originale usa $ chiave. "=". urlencode (stripslashes ($ value)) 'ma sono abbastanza sicuro che' http_build_query' è un'alternativa superiore, suppongo che abbiano scelto di non usarlo per rimanere compatibili con PHP 4.x. Nell'implementazione originale 'node-recaptcha' res.setEncoding ('utf8')' non è inclusa, l'hai aggiunta tu stesso? – Halcyon

+0

Hai ragione, non c'è 'res.setEncoding ('utf8')' nel nodo-recaptcha ma se lo fai fino in fondo [riga 151] (https://github.com/mirhampt/node-recaptcha /blob/master/lib/recaptcha.js#L151) si vede che la risposta viene infine scritta nel flusso di output nella codifica utf-8. Non so davvero se questo è fondamentale ma l'ho incluso nella mia soluzione e ha funzionato. – floriankrueger

2

+1 al @florian per la risposta molto utile. Per i posteri, ho pensato di fornire alcune informazioni su come verificare come appare la tua richiesta captcha per aiutarti a verificare che vengano specificati gli intestazioni ei parametri appropriati.

Se si utilizza un computer Mac o Linux o si ha accesso a uno di questi in locale, è possibile utilizzare il comando netcat per configurare un server veloce. Immagino che ci siano netcat windows ports ma io ho no esperienza con loro.

nc -l 8100 

Questo comando crea un socket TCP in ascolto sul pot 8100 e attende una connessione. È quindi possibile modificare l'URL di verifica captcha da http://www.google.com/recaptcha/... nel codice server per essere http://localhost:8100/. Quando il codice rende il POST all'URL verifica si dovrebbe vedere la richiesta emessa al ghiaione per 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 

Usando questo, sono stato in grado di vedere che la mia chiave privata è stato danneggiato.

Problemi correlati