如何使用滑轨验证reCAPTCHA?

问题描述 投票:9回答:4

我已经看到了一些有关如何在PHP中使用新的Recaptcha的指南,但没有关于Rails的指南。这是我到目前为止的代码:

<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

我如何确认响应为真还是假? Google关于此主题的文档非常令人困惑。

ruby-on-rails ruby validation ruby-on-rails-4 recaptcha
4个回答
3
投票

我会看recaptcha宝石。看起来他们即将支持新的API。


2
投票

这是一个非常简单的基本脚本。我不知道您是否期望这样的事情。您可以从中获得概念并在此基础上进行构建,以使其适应您的用例。

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.

1
投票

您应该可以使用HTTParty做到这一点。

# 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

您可以像这样在控制器或模型中使用它:

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
投票

由于可接受的答案有些过时,我将在此处添加我的代码:

def verify_recaptcha(request, params) #returns true if verification succeeded
    require 'net/http'
    uri = URI("https://www.google.com/recaptcha/api/siteverify")
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    verify_request = Net::HTTP::Post.new(uri.path)
    verify_request.set_form_data( 'secret'=> __your_secret_key_goes_here__,
                                  'response' => params['g-recaptcha-response'] )

    googleanswer = https.request(verify_request)
    resultingjson = JSON.parse( googleanswer.body )
    return resultingjson['success']
end

这正在使用Ruby 2.3.1和Rails 5.0.2。

© www.soinside.com 2019 - 2024. All rights reserved.