[英]How to verify reCAPTCHA using rails?
我看過一些關於如何在 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 %>
用戶控制器.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
如何驗證響應是真還是假? 谷歌關於這個主題的文檔非常混亂。
我會看看recaptcha gem。 看起來他們即將支持新的 API。
你應該可以用 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
這是一個非常簡單的基本腳本。 我不知道你是否期待這樣的事情。 您可以從中獲取概念並在此基礎上進行構建以使其適應您的用例。
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.
我將在此處添加我的代碼,因為接受的答案有些過時:
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.