Open2

reCAPTCHの導入

アンドロイドなかしおアンドロイドなかしお
/Gemfile
gem 'recaptcha'

いつものを実行

$ bundle install

JavaScript API を読み込みます。

/application.html.erb
<%= javascript_include_tag "https://www.google.com/recaptcha/api.js" %>
RECAPTCHA_SECRET_KEY=********************************
RECAPTCHA_SITE_KEY=********************************

以下をアクションの最初等に追記する

contoroller
unless verify_recaptcha(action: 'login', minimum_score: 0.5)
  Rails.logger.error "WARNING: illegal reCAPTCHA request from \"#{request.remote_ip}\""

  flash.now[:danger] = "ロボットの可能性があります。再度お試しください"
  render 'new', status: :unprocessable_entity
  return
end

フォームに追記する

form
<%= recaptcha_v3(action: 'login') %>

参考URL

https://dev.to/yalinhua/easy-way-to-implement-recaptcha-v3-in-ruby-on-rails-419g
https://ryoma123.hatenablog.com/entry/2021/11/16/013323
初回は v3 で検証を行うが、失敗した場合に v2 のチェックボックス等を表示させてフォールバックできる方法が紹介されているとか

https://github.com/ambethia/recaptcha

アクション名の確認
https://cloud.google.com/recaptcha/docs/actions-website?hl=ja

アンドロイドなかしおアンドロイドなかしお

具体的なあれそれ

/views/sessions/new.html.erb
<%= recaptcha_v3(action: 'login') %>
/controllers/sessions_controller.rb
    # reCAPTCHAの検証
    return unless verify_recaptcha_and_handle_error(
      action: 'login', render_template: 'new')
/controllers/application_controller.rb
include RecaptchaHelper
/helpers/recaptcha_helper.rb
module RecaptchaHelper
  def verify_recaptcha_and_handle_error(action:, render_template:, minimum_score: 0.5)
    unless verify_recaptcha(action: action, minimum_score: minimum_score)
      Rails.logger.error "WARNING: illegal reCAPTCHA request from \"#{request.remote_ip}\""
      message  = "Botだと判断されました。もう一度やり直してください。"
      message += "何度やっても上手くいかない場合は、お手数ですが管理者にお問い合わせください"
      flash[:danger] = message
      render render_template, status: :unprocessable_entity
      return false
    end
    true
  end
end
/config/initializers/recaptcha.rb
Recaptcha.configure do |config|
  config.site_key   = Rails.application.credentials.recaptcha[:site_key]
  config.secret_key = Rails.application.credentials.recaptcha[:secret_key]
end