首页 > 解决方案 > 应用程序未向 google recaptcha v3 发送请求

问题描述

我正在使用带有recaptcha gem的devise gem。我配置了我的应用程序,以便它加载recaptcha - 它在左下角可见。

这是我尝试登录后得到的日志:

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)

我也没有在 recaptcha v3 控制台中使用“注册”收到任何新请求。

这是我的代码:

注册控制器.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

session_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

设计新的注册视图

<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" %>

设计新的会话视图

<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" %>

我在 routes.rb 中有那行: devise_for :users,controllers: {omniauth_callbacks: 'omniauth', registrations: 'registrations', sessions: 'sessions'}

标签: ruby-on-railsrubydeviserecaptcha

解决方案


推荐阅读