ruby 使用Rails的新recaptcha的工作示例?

u4dcyp6a  于 2023-06-22  发布在  Ruby
关注(0)|答案(4)|浏览(161)

有没有人在Rails应用程序中使用Google新的reptcha的工作示例?我试图遵循的每一个指南要么不清楚要么不完整,似乎使用了不同的方法。
手写编码会更好。

正在进行的工作:

config/environments/production.rb:

#...
  recaptcha_public_key= "[PUBLIC KEY]"
  recaptcha_private_key= "[PRIVATE KEY]"
end

config/environments/development.rb:

#...
  recaptcha_public_key= "[PUBLIC KEY]"
  recaptcha_private_key= "[PRIVATE KEY]"
end

config/initializers/recaptcha.rb

Recaptcha.configure do |config|
  config.public_key  = Rails.application.secrets.recaptcha_public_key
  config.private_key = Rails.application.secrets.recaptcha_secret_key
  config.api_version = 'v2'
end
vbopmzt1

vbopmzt11#

使用recaptcha gem创建了一个使用复选框方法的示例。
代码可在这里:https://github.com/sunnyrjuneja/recaptcha_example
提交应该很容易遵循。如果你还有问题就告诉我。
此处的应用示例:https://recaptcha-checkbox.herokuapp.com/
更新:
这里有一个方法来做到这一点没有secrets.yml。
将初始化器更改为如下所示:

Recaptcha.configure do |config|
  config.public_key  = ENV['RECAPTCHA_PUBLIC_KEY']
  config.private_key = ENV['RECAPTCHA_PRIVATE_KEY']
end

在开发或生产环境中,将其添加到.bashrc或. zshrc中。

export RECAPTCHA_PUBLIC_KEY="YOURPUBLICKEY"
export RECAPTCHA_PRIVATE_KEY="YOURPRIVATEKEY"

如果你使用Heroku来部署,在你的命令行上执行以下操作:

heroku config:set RECAPTCHA_PUBLIC_KEY="YOURPUBLICKEY"
heroku config:set RECAPTCHA_PRIVATE_KEY="YOURPRIVATEKEY"

更新2:
recaptcha gem现在使用不同的方法名来设置键。
Recaptcha.configure do |config| config.site_key = 'YOUR_SITE_KEY_HERE' config.secret_key = 'YOUR_SECRET_KEY_HERE' # Uncomment the following line if you are using a proxy server: # config.proxy = 'http://myproxy.com.au:8080' end

wn9m85ua

wn9m85ua2#

请遵循以下步骤:
步骤1.创建一个Ruby on Rails应用程序:
a)打开终端,导航到您有权创建应用程序的目录并键入:铁路新回顾
B)创建应用程序后,切换到其文件夹:
$cd recap
c)键入并运行bundle install:
$bundle install

  • 步骤2.创建模型、视图和控制器:-*
  • 步骤3.将Google Recaptcha与Ruby On Rails集成:-*

a)请登录Google Recaptcha网站注册您的域名以获得访问权限。(https://www.google.com/recaptcha/intro/index.html
B)请登录并注册您的网站,详细信息c)注册后,谷歌提供
脚本标记将此代码段放在HTML模板的结束标记之前。div将此代码段放在您希望reCAPTCHA小部件出现的位置的末尾。
d)完成上述步骤后,我们可以在网站中看到recaptcha。
f)对于服务器端验证,我们可以使用密钥和响应,它们将作为参数发送到控制器中的表单提交操作。
g)要检查Google是否已验证该用户,请发送包含以下参数的GET请求:URL:https://www.google.com/recaptcha/api/siteverify
步骤4.服务器端验证的应用程序代码更改。
请参阅以下链接了解更多详情,
1)recaptcha-in-rails
2)google-recaptcha-in-rails
在布局中:

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

我的视图app/views/users/_form.html.erb:
<div class="g-recaptcha" data-sitekey="6LdgWwETAAAAAPwAddRqDtNbt9sdfsfsfsdJhggghhKKYTdadsHt54"></div>
在初始化器中:

SECRET_KEY = "my_secret_key_here"

在用户控制器中:

def verify_google_recptcha(secret_key,response)
  status = `curl "https://www.google.com/recaptcha/api/siteverify?secret=#{secret_key}&response=#{response}"`
     logger.info "---------------status ==> #{status}"
     hash = JSON.parse(status)
     hash["success"] == true ? true : false
  end

  def create
    @user = User.new(user_params)
    status = verify_google_recptcha(SECRET_KEY,params["g-recaptcha-response"])
    respond_to do |format|
    if @user.save && status
      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render :show, status: :created, location: @user }
    else
      format.html { render :new }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end
logger.info "---------------status ==> #{status}" will print like below

错误:

---------------status ==> {
"success": false,
 "error-codes": [
  "missing-input-response"
 ]
}

在成功

---------------status ==> {
"success": true
}

因为你可以把status["error-codes"][0]表示为_form.html.erb
查看我在heroku中的应用程序

pn9klfpd

pn9klfpd3#

您应该从RailsCarma's Blog尝试此示例。
请按照以下步骤操作:1)获取凭据2)添加recaptcha标记3)要处理验证,请创建一个recaptcha类4)在注册控制器中添加verify_recaptcha方法

设置步骤1:-

将以下内容添加到gem文件中:

gem “recaptcha”, :require => “recaptcha/rails”

第二步:-

登录developers.google.com,登录你的gmail账户,然后搜索“recaptcha”。点击“注册API密钥”链接。检查密钥和站点密钥。顾名思义,秘密密钥应该保存在更安全的位置,而站点密钥是用于向Google进行身份验证的公钥。注册您的网站名称与您的谷歌帐户检索公共和私人的关键,将用于以后的应用程序。
注册完成后,您将获得公钥和私钥。从客户端侧,公钥被发送到recaptcha服务以请求新的验证码。在服务器端应用私钥以验证是否输入了正确的值。
然后注册一个reCAPTCHA API密钥,并将其添加到您的环境配置文件中:

#put this in development.rb and in production.rb
ENV_RECAPTCHA_PUBLIC_KEY= ‘your-public-key’
ENV_RECAPTCHA_PRIVATE_KEY= ‘your-private-key’

第三步:-

Create a file named recaptcha.rb in config/initializers to configure recaptcha parameters.
Recaptcha.configure do |config|
config.public_key = ‘ ENV_RECAPTCHA_PUBLIC_KEY’
config.private_key = ‘ENV_RECAPTCHA_PRIVATE_KEY’
config.proxy = ‘http://www.google.com/recaptcha/api/verify’
end

第四步:-查看

验证码宝石有助于呈现实际的验证码框。这很简单,只需在视图中您希望显示验证码的位置添加以下内容:

<%= raw recaptcha_tags %>
If you are using SSL, use this instead:
<%= recaptcha_tags :ssl => true %>, The SSL option ensures we send a https request to the recaptcha service.

第五步:-控制器

Captcha Gem提供了另一个辅助方法,该方法发布到reCaptcha API服务器以验证提交是否正确。如果是,则该方法返回true,如果不是,它将向模型示例添加一个自定义错误消息,指出recaptcha是错误的。下面是控制器的创建操作中的基本代码:
在devise controllers,app/controllers/registrations_controller.rb中,插入以下代码:

require ‘recaptcha.rb’
before_action :verify_recaptcha, only: [:create]
def verify_recaptcha
response = Recaptcha.verify(params)
session[:sign_up] = params[:user].except(:password, :password_confirmation, :remoteip)
if response.code == 200
if response[‘success’]
flash[:notice] = “Recaptcha verification successful.”
else
redirect_to new_user_registration_path(user: params[:user]),
alert: “Recaptcha verification error.”
end
else
redirect_to new_user_registration_path(user: params[:user]),
alert: “HTTP connection error.”
end
end

会话[:sign_up]被持久化,因为如果验证失败,可以预先填写注册表单。

cxfofazt

cxfofazt4#

    • 完整的解决方案,逐步实现:**

这里的其他答案不再起作用了,因为recaptcha gem已经更新了,你可以检查here。这就是我在Rails6应用程序中使用recaptcha的步骤。

    • 步骤1:**将宝石放入Gemfile中:

宝石'rectcha'
如果您使用gems figaro(就像我的例子)或dotenv来存储Env变量,您需要将rectcha gem放置在这两个gem中任何一个的声明下面。

    • 第二步:**获取recaptcha APY键:

转到属于Google的reCAPTCHA admin console页面,获取一个reCAPTCHA API密钥用于生产,另一个用于开发(稍后您将看到原因)。暂时把所有信息复制到安全的地方。为了在这个问题上有一些顺序,因为将来可能需要几个其他的reptcha键,您应该遵循某种独特的符号来标记这些reptcha键。例如,在我的例子中,它是为我的个人网站,所以我称它们为 * reiniergarcia_production * 和 * reiniergarcia_development *。
您需要在那里选择要使用的特定类型的recaptcha。一种类型的recaptcha的API密钥不适用于另一种类型的recaptcha。在我的例子中,我使用了v2复选框类型(即:“我不是机器人”)。

    • 第三步:**将reptcha APY密钥存储在rails上:

在我的例子中,我使用Figaro将环境变量存储在Rails上,所以这是我在config/application. yml输入的内容:

production:
  recaptcha_site_key: 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'
  recaptcha_secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

development:
  recaptcha_site_key: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
  recaptcha_secret_key: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
    • 步骤#4:**添加Recaptcha初始化器:

我添加了文件 * config/initializers/recaptcha. rb *,并在其中放置:

Recaptcha.configure do |config|
  # New configuration format:
  config.site_key = Figaro.env.recaptcha_site_key
  config.secret_key = Figaro.env.recaptcha_secret_key
end

这是新的配置。请注意,现在它是site_key & secret_key(不再是public_key或private_key)。Figaro将根据环境动态加载正确的密钥。在我的情况下,我部署到Heroku,但不要担心,因为我很快就会到达那里。

    • 步骤#5:**在表单中放置recatcha标签:

这就是我在我的案例中所做的:

<%= form_with(model: contact, local: true) do |form| %>
    <%= hidden_field_tag :return_to, return_to %>

    <%= form.text_field :name, placeholder: 'Name', autofocus: false %>
    <%= form.email_field :email, placeholder: 'Email', autofocus: false %>
    <%= form.text_field :subject, placeholder: 'Subject', autofocus: false %>
    <%= form.text_area :message, placeholder: 'Message', autofocus: false, disabled: false %>

    <div class="row">
      <div class="col-md-6">
        <div style="margin-top: 14px;">
          <%= recaptcha_tags %>
        </div>
      </div>

      <div class="col-md-6 submit-button">
        <%= form.submit "SEND", name: "send" %>
      </div>
    </div>
  <% end %>
    • 步骤6:**设置rectcha标签的样式:

您可能需要在前端设置recaptcha标记的位置和/或大小(为recaptcha_tags助手生成)。这就是我在我的案例中所做的:
我添加了文件app/assets/stylesheets/recaptcha_tags. scss,并使用:

.g-recaptcha {
  transform: scale(0.6);
  transform-origin: 0 0;
}

它允许首先减小recaptcha标签的大小(非常有用,因为recaptcha标签通常太大)。在您的情况下,如果您需要添加进一步的样式,您应该将其放置在那里,而不是与css代码的其余部分混合使用。导入这个样式文件的方法是在 * app/assets/stylesheets/application. scss * 添加以下内容:

// Imports the recaptcha_tags styling:
@import "recaptcha_tags";

SideNote:* 如果你打算使用几个布局,你应该每个布局都有一个主. scss文件,在每个布局上你只导入那些特定布局所必需的内容(只导入那些额外的. scss绝对必要)。
步骤7:添加verify_reaptcha逻辑:
您需要在相应控制器的正确操作中添加verify_rectcha逻辑。在我的例子中,我只想在用户“不是机器人”的情况下持久化一个Contact对象,所以我在app/controllers/contacts_controller. rb中这样做:

def create
    @contact = contact_service.build_contact(contact_params)

    if verify_recaptcha(model: @contact) && @contact.save
      redirect_notice = t('contacts.send.success_notice')
      redirect_to @return_to, notice: redirect_notice
    else
      flash[:alert] = @contact.errors.full_messages.first
      redirect_to @return_to
    end
  end

如果用户没有点击“我不是机器人”,它会在我的页面上显示一个flash错误。

    • 第8步:**放置环境。服务器中的变量:

就像我之前说的,我使用Heroku。所以我只是在Heroku中进入我的 Jmeter 板,然后我点击我的项目,稍后在设置选项卡,然后在一个按钮上说:“显示配置变量”。然后我将在最后添加以下对(仅限键和值):

recaptcha_site_key: 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'
  recaptcha_secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

正如您所看到的,我只添加了生产recaptcha APY键。
您也可以在终端上通过执行以下操作:

$ heroku config:set recaptcha_site_key=wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
$ heroku config:set recaptcha_secret_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    • 第9步:**将所有更改推送到Github:
$ git push origin master
    • 第10步:**再次部署到Heroku:
$ git push heroku master

就是这样如果您遵循这些步骤,您应该有您的reptcha完美运行在您的生产网站。希望对你有用。

相关问题