ruby-on-rails - 应用程序未向 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'}
解决方案
推荐阅读
- c++ - 为什么默认 noexcept 移动构造函数被接受?
- delphi - Delphi IPWorks XMPP - 搜索用户
- javascript - Redux 在重新加载时失去了 firebase 用户
- python - 在 cx_Oracle 中循环追加大型数据集的 SQL 字典
- django - 如何使用 docker 在 Django 中执行代码导航
- ios - 将 UIView 中输入的数据传递给 Widget
- c++ - C ++客户端套接字仅接收消息的第一个字母
- python - 破折号,输入自动提示
- http-live-streaming - 如何仅将 HLS 流配置到 Ant Media Server 中定义的 IP 地址?
- python - 如何可视化交易矩阵