I am using devise gem with recaptcha gem. I configured my application so it loads recaptcha - it's visible in left bottom corner.
That's the log I get after trying to sign in:
Started POST "/users/sign_in" for 127.0.0.1 at 2021-11-07 18:10:31 +0100
Processing by SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"gw0XprvwiQWRiv1EmUfHzIQcUWAdKld5M283C0ARWXK3Tla00FljkclaatO1xd6RfKWgDdqcsxv/NC0sqJsT5w==", "g-recaptcha-response-data"=>{"login"=>"03AGdBq26JYLS45wyivFvWpZJ77-SgH1wTQDGyYu801FRJGjcYsaWFbTQ7jsvwhQoGSxC3SMHDxPMgJNnCYZgSNyTTND-XHvs6-ibWrOxM0Mz_d4JDYXafB7q6ZCbZGbVB0Bjyqp-1C0dDZMR7u9G_FyRBUzZrVaAH-oys8qZf2aZmhtXwDnsdqdMSkfvM5yk9L4edDlNjOz0MYGHIWEqh-50dS7inzd2xrouy-4OY6ENz63jLCdKKIJfPsHTJYqg4jtBC9frDzsa_WicuBHJjFUO6XD1hgs99m6hMIeWy4vyVfrjF-sPfhku0i_4yHnquz_ihFVA8XmhbeoOlAEga-BONbXrHdQ2lSozRAjdp6Sh7e5xogo-Zb5Ay6KFCTU-Dt4WLr4fJChOHV-8qNoZ3RMy1YuRhgFhPyRuUNXJPY95o0vBKOIsvl8i-wRHCZcOgF3XOMn8-kCYz"}, "g-recaptcha-response"=>"", "user"=>{"email"=>"udasie@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["email", "udasie@gmail.com"], ["LIMIT", 1]]
↳ vendor/cache/ruby/2.7.0/gems/activerecord-5.2.6/lib/active_record/log_subscriber.rb:98
Completed 401 Unauthorized in 265ms (ActiveRecord: 0.9ms)
Processing by SessionsController#new as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"gw0XprvwiQWRiv1EmUfHzIQcUWAdKld5M283C0ARWXK3Tla00FljkclaatO1xd6RfKWgDdqcsxv/NC0sqJsT5w==", "g-recaptcha-response-data"=>{"login"=>"03AGdBq26JYLS45wyivFvWpZJ77-SgH1wTQDGyYu801FRJGjcYsaWFbTQ7jsvwhQoGSxC3SMHDxPMgJNnCYZgSNyTTND-XHvs6-ibWrOxM0Mz_d4JDYXafB7q6ZCbZGbVB0Bjyqp-1C0dDZMR7u9G_FyRBUzZrVaAH-oys8qZf2aZmhtXwDnsdqdMSkfvM5yk9L4edDlNjOz0MYGHIWEqh-50dS7inzd2xrouy-4OY6ENz63jLCdKKIJfPsHTJYqg4jtBC9frDzsa_WicuBHJjFUO6XD1hgs99m6hMIeWy4vyVfrjF-sPfhku0i_4yHnquz_ihFVA8XmhbeoOlAEga-BONbXrHdQ2lSozRAjdp6Sh7e5xogo-Zb5Ay6KFCTU-Dt4WLr4fJChOHV-8qNoZ3RMy1YuRhgFhPyRuUNXJPY95o0vBKOIsvl8i-wRHCZcOgF3XOMn8-kCYz"}, "g-recaptcha-response"=>"", "user"=>{"email"=>"udasie@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
Rendering devise/sessions/new.html.erb within layouts/application
Rendered devise/shared/_links.html.erb (3.9ms)
Rendered devise/sessions/new.html.erb within layouts/application (8.3ms)
Rendered layouts/_navigation-bar.html.erb (0.3ms)
Completed 200 OK in 211ms (Views: 31.3ms | ActiveRecord: 0.0ms)
I don't get any new requests in recaptcha v3 console using "sign up" too.
Here is my code for:
registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
prepend_before_action :check_captcha, only: [:create]
prepend_before_action :configure_permitted_parameters
private
def check_captcha
return if verify_recaptcha(action: 'signup')
self.resource = resource_class.new sign_up_params
resource.validate # Look for any other validation errors besides reCAPTCHA
set_minimum_password_length
respond_with_navigational(resource) do
flash.discard(:recaptcha_error) # We need to discard flash to avoid showing it on the next page reload
render :new
end
end
end
sessions_controller.rb
class SessionsController < Devise::SessionsController
prepend_before_action :check_captcha, only: [:create] # Change this to be any actions you want to protect.
prepend_before_action :configure_permitted_parameters
private
def check_captcha
return if verify_recaptcha(action: 'login')
self.resource = resource_class.new sign_in_params
respond_with_navigational(resource) do
flash.discard(:recaptcha_error) # We need to discard flash to avoid showing it on the next page reload
render :new
end
end
end
devise new registration view
<h2>Sign up</h2>
<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= f.error_notification %>
<%= flash[:recaptcha_error] %>
<%= recaptcha_v3(action: 'signup') %>
<div class="form-inputs">
<%= f.input :email,
required: true,
autofocus: true,
input_html: { autocomplete: "email" }%>
<%= f.input :username,
required: true %>
<%= f.input :password,
required: true,
hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length),
input_html: { autocomplete: "new-password" } %>
<%= f.input :password_confirmation,
required: true,
input_html: { autocomplete: "new-password" } %>
</div>
<div class="form-actions">
<%= f.button :submit, "Sign up", class: 'btn btn-success' %>
</div>
<% end %>
<%= render "devise/shared/links" %>
devise new session view
<h2>Log in</h2>
<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= f.error_notification %>
<%= flash[:recaptcha_error] %>
<%= recaptcha_v3(action: 'login') %>
<div class="form-inputs">
<%= f.input :email,
required: true,
autofocus: true,
input_html: { autocomplete: "email" } %>
<%= f.input :password,
required: true,
input_html: { autocomplete: "current-password" } %>
<%= f.input :remember_me, as: :boolean if devise_mapping.rememberable? %>
</div>
<div class="form-actions">
<%= f.button :submit, "Sign in", class: 'btn btn-success' %>
</div>
<% end %>
<%= render "devise/shared/links" %>
I have that line in routes.rb:
devise_for :users,controllers: {omniauth_callbacks: 'omniauth', registrations: 'registrations', sessions: 'sessions'}