2015-01-10 12 views
9

Ich habe ein paar Anleitungen für die Verwendung des neuen Recaptcha mit PHP gesehen, aber keine mit Rails. Dies ist der Code, den ich bisher habe:Wie überprüfe reCAPTCHA mit Schienen?

<script src='https://www.google.com/recaptcha/api.js'></script> 

<%= form_for @user, :url => users_path, :html => { :multipart => true } do |f| %> 
    <%= f.text_field :name %> 
    <div class="g-recaptcha" data-sitekey="..."></div> 
    <%= f.submit "Submit" %> 
<% end %> 

users_controller.rb

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     redirect_to users_success_path 
    else 
     flash[:notice] = "Failed" 
     redirect_to new_user_path 
    end 
    end 

Wie kann ich die Antwort als richtig oder falsch überprüfen? Die Google-Dokumentation zu diesem Thema ist äußerst verwirrend.

+0

@@ Ken Anderson haben Sie in ReCaptcha Helfer für Rubin sah apps https://github.com/ambethia/recaptcha/ –

Antwort

4

Ich würde die recaptcha Edelstein betrachten. Es sieht so aus, als wären sie kurz davor, die neue API zu unterstützen.

+1

Ich würde es vorziehen, nicht den Edelstein zu verwenden. –

+2

@KenAnderson Auch wenn Sie es nicht verwenden, können Sie sich den Quellcode ansehen und sehen, wie er ihn implementiert. – rdubya

+0

Das einzige, was ich aus dem Quellcode herausfinden konnte, war eine Zeile 'if verify_recaptcha' hinzuzufügen, aber anscheinend ist 'verify_recaptcha' eine undefinierte Methode. Bin ich wenigstens auf dem richtigen Weg? –

2

Sie sollten es mit HTTParty tun können.

# Gemfile 
gem 'httparty' 

bundle 

# app/models/recaptcha_verifier.rb 
class RecaptchaVerifier 
    def initialize(response, ip) 
    @response = response 
    @ip = ip 
    end 

    def self.verify(response, ip = nil) 
    new(response, ip).verify 
    end 

    def verify 
    recaptcha_response = HTTParty.get(recaptcha_url(@response, secret, @ip)) 
    response_success?(recaptcha_response) 
    end 

    private 
    def recaptcha_url(response, secret, ip) 
    "https://www.google.com/recaptcha/api/siteverify?secret=#{secret}&response=#{response}&remoteip=#{ip}" 
    end 

    def secret 
    # load your secret here or hardcode it 
    end 

    def response_success?(response) 
    response.fetch('success') 
    end 
end 

Sie können es in Ihrem Controller oder das Modell verwenden, etwa so:

class SomeController 
    def some_action 
    if RecaptchaVerifier.verify(params[:user][:g-recaptcha-response]) 
     # proceed 
    else 
     # output some flash warning and render same action or redirect_to :back 
    end 
    end 
end 
+0

Sollte ich 'rails generate' das recaptcha_verifier Modell? –

+0

Kopieren Sie einfach und fügen Sie es in app/models/recaptcha_verifier.rb –

+0

Ich verwende nicht multi_xml. Wird das Schmuckstück noch funktionieren? –

2

Dies ist ein sehr einfacher Grund Skript. Ich weiß nicht, ob du so etwas erwartest. Sie könnten das Konzept daraus ableiten und darauf aufbauen, um es an Ihren Anwendungsfall anzupassen.

require 'uri' 
require 'net/http' 

uri = URI("http://www.google.com/recaptcha/api/verify") 
https = Net::HTTP.new(uri.host, uri.port) 
https.use_ssl = true 

verify_request = Net::HTTP::Post.new(uri.path) 

verify_request["secret"]  = your_private_key 
verify_request["remoteip"] = request.remote_ip, #ip address of the user 
verify_request["challenge"] = params[:recaptcha_challenge_field], #recaptcha challenge field value 
verify_request["response"] = params[:recaptcha_response_field] # recaptcha response field value 

response = https.request(request) 
puts response 

#the response will be json and you could parse it check whether the captcha is correct or not. 
+0

Ich vermute, das würde in meinem Modell gehen, oder? Also, was würde ich meinem Controller hinzufügen? –

+0

Sie können diese Captcha-Überprüfung in Ihrem Controller mit einem before_filter durchführen, bevor Sie tatsächlich etwas verarbeiten und dann umleiten, wenn die Überprüfung des Captchas fehlschlägt. Sie müssen diesen Code nicht zu einem Modell bringen. –

+0

Ich habe meinen Controller veröffentlicht. Welchen Teil Ihres Codes würde in meinem 'def create' gehen? Und speziell wo? –