2011-09-16 10 views
9

Może możecie mi w tym pomóc. Próbuję wdrożyć reCAPTCHA w mojej aplikacji node.js i niezależnie od tego, co robię, otrzymuję odpowiedź " " invalid-site-private-key ".Ciągle otrzymuję "nieprawidłowy-site-private-key" na mojej prośbie o zatwierdzenie reCAPTCHA

Oto rzeczy, podwójne i dwuosobowe wypróbowaniu:

  1. odpowiednie klawisze
  2. Klawisze nie są zamienione
  3. Klawisze są „globalne klawisze” jak ja testuje na localhost i myślał, że może być problem z tym
  4. Testowane w środowisku produkcyjnym na serwerze - sam problem

Ostatnią rzeczą, jaką można pomyśleć, że moje żądanie POST do samego interfejsu API reCAPTCHA jest nieprawidłowe, ponieważ konkretny format treści nie jest wyraźnie udokumentowany (parametry są udokumentowane, wiem o tym). Więc to jest organem prośba Jestem obecnie wysyłanie (klucz i IP zostanie zmieniony ale sprawdziłem je na mojej stronie):

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

Czy jest coś złego w tym formacie? Czy muszę wysyłać specjalne nagłówki ? Czy całkowicie się mylę? (Pracuję przez 16 godzin prosto teraz, więc to może być ..)

Dziękuję za pomoc!

+0

Za mało podanych szczegółów. Jakie są nagłówki żądań? Czy korzystasz z modułu takiego jak https://github.com/mirhampt/node-recaptcha? Może spróbuj ponownie opublikować, kiedy się przespisz. : P – broofa

+0

Hej broofa, przepraszam, że moje pytanie nie wystarczało, aby na nie odpowiedzieć. mimo to niezamierzenie rozwiązałeś mój problem b/c w module, który publikujesz nieudokumentowane nagłówki, które są niezbędne do zweryfikowania, czy używasz reCAPTCHA, więc udało mi się zbudować je we własnym rozwiązaniu. Postawię rozwiązanie później jako odpowiedź. Dziękuję Ci! ;) – floriankrueger

Odpowiedz

17

Jak wspomniano w komentarzach powyżej, samodzielnie udało mi się rozwiązać problem za pomocą broofa i modułu węzeł-recaptcha dostępnego pod numerem https://github.com/mirhampt/node-recaptcha.

Ale po pierwsze, aby wypełnić brakujące dane z góry:

  • nie używałem żadnego modułu, moje rozwiązanie jest całkowicie samowystarczalny napisany na podstawie dokumentacji dostępnej w the reCAPTCHA website.
  • Nie wysłałem żadnych nagłówków żądań, ponieważ w dokumentacji nie podano nic. Wszystko, co zostało powiedziane na temat żądania przed wyjaśnieniem niezbędnych parametrów, jest następujące:

    "Po pomyślnym wyświetleniu strony reCAPTCHA, należy skonfigurować formularz, aby sprawdzić, czy odpowiedzi wprowadzone przez użytkowników są poprawne. Można to osiągnąć, wysyłając żądanie POST pod numer http://www.google.com/recaptcha/api/verify. Poniżej znajdują się odpowiednie parametry. "

    - „Jak sprawdzić odpowiedź użytkownika” na http://code.google.com/apis/recaptcha/docs/verify.html

Więc zbudowany kwerendy siebie (co jest jedno-liner ale jest module o tym równie dobrze jak ja nauczyłem teraz) zawiera wszystkie parametry i wysłał je do punktu końcowego interfejsu API reCAPTCHA. Otrzymałem tylko kod błędu invalid-site-private-key, który tak naprawdę (jak wiemy) jest błędnym sposobem wysłania 400 Bad Request. Może powinni zastanowić się nad wprowadzeniem tego w życie, żeby ludzie nie zastanawiali się, co jest nie tak z ich kluczami.

Są to parametry nagłówka, które są oczywiście konieczne (one oznaczać jesteś wysyłając formularz):

  • Content-Length który musi mieć długość łańcucha zapytania
  • Content-Type który musi być application/x-www-form-urlencoded

Inną rzeczą, dowiedziałem się od modułu node-recaptcha jest, że należy wysłać ciągu kwerendy utf8 zakodowany.

Moje rozwiązanie wygląda następująco: możesz go użyć lub zbudować na nim, ale obsługa błędów nie jest jeszcze zaimplementowana. I jest napisane w 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() 

Dziękuję :)

+2

Wpadłem również na ten problem, dzięki czemu ustawienie nagłówka 'Content-Type' zadziałało dla mnie, dzięki! ("Content-Length" został już ustawiony przez mój framework). – Halcyon

+1

Wspomniałeś, że dane muszą być kodowane "utf8". Używam implementacji opartej na PHP i nawet w oryginalnym kodzie biblioteki (v1.11) nie mogę znaleźć żadnej wzmianki o tym. Oryginalna implementacja używa '$ key." = ". urlencode (stripslashes (wartość $)) 'ale jestem całkiem pewny' http_build_query' jest lepszą alternatywą, domyślam się, że zdecydowali się nie używać go, aby pozostać kompatybilnym z PHP 4.x. W oryginalnej implementacji 'node-recaptcha'' res.setEncoding ('utf8') 'nie jest dołączone, dodałeś to sam? – Halcyon

+0

Masz rację, nie ma 'res.setEncoding ('utf8')' w recaptcha węzła, ale jeśli ostrożnie całą drogę w dół do [linia 151] (https://github.com/mirhampt/node-recaptcha /blob/master/lib/recaptcha.js#L151) widzisz, że odpowiedź jest ostatecznie zapisana w strumieniu wyjściowym w kodowaniu utf-8. Naprawdę nie wiem, czy to jest kluczowe, ale zawarłem to w moim rozwiązaniu i zadziałało. – floriankrueger

2

+1 do @florian za bardzo pomocne odpowiedzi. W przypadku potomności myślałem, że udzielę informacji o tym, jak sprawdzić, jak wygląda żądanie captcha, aby pomóc ci upewnić się, że określone są odpowiednie nagłówki i parametry.

Jeśli używasz komputera Mac lub Linux lub masz dostęp do jednego z tych lokalnie, możesz użyć polecenia netcat, aby skonfigurować szybki serwer. Domyślam się, że są netcat windows ports, ale mam z nimi no.

nc -l 8100 

To polecenie tworzy gniazdo TCP nasłuchujące na puli 8100 i oczekuje na połączenie. Następnie można zmienić adres URL sprawdzania captcha z http://www.google.com/recaptcha/... w kodzie serwera na http://localhost:8100/. Gdy kod czyni POST do adresu URL sprawdzenia powinieneś zobaczyć Twój wniosek wysyłany do piargi przez netcata:

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 

Używanie tego, byłem w stanie zobaczyć, że mój prywatny klucz został uszkodzony.