You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中Google reCAPTCHA v2验证失败问题求助

排查 Rails + Devise + reCAPTCHA v2 首次验证失败问题

嘿,我之前也踩过类似的坑,咱们一步步拆解排查,应该能快速定位到问题:

1. 先确认前端表单的reCAPTCHA渲染是否正确

首先要确保登录表单里正确加载了reCAPTCHA组件,用gem提供的recaptcha_tags helper:

# app/views/devise/sessions/new.html.erb
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
  <!-- 你的邮箱、密码输入字段 -->
  <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  <%= f.password_field :password, autocomplete: "current-password" %>
  
  <% if @show_recaptcha %>
    <%= recaptcha_tags %>
    <% if resource.errors.any? %>
      <div class="alert alert-danger">
        <%= resource.errors.full_messages.join(', ') %>
      </div>
    <% end %>
  <% end %>
  
  <%= f.submit "登录" %>
<% end %>

这里的@show_recaptcha是你在控制器里判断连续3次错误后设置的变量,触发条件时要确认组件确实渲染出来了——可以查看页面源码,检查recaptcha组件的data-sitekey属性是否和你注册的站点密钥一致。

2. 检查初始化文件的配置是否准确

打开config/initializers/recaptcha.rb,确认配置正确读取了.env里的变量,且环境区分合理:

Recaptcha.configure do |config|
  config.site_key = ENV['RECAPTCHA_SITE_KEY']
  config.secret_key = ENV['RECAPTCHA_SECRET_KEY']
  # 开发环境可以开启调试模式,方便排查请求日志
  # config.debug = Rails.env.development?
end

要注意:

  • .env文件里的变量名要和这里完全匹配(比如别把RECAPTCHA_SITE_KEY写成RECAPTCHA_SITEKEY)
  • 开发环境要确保引入了dotenv-rails,Gemfile里加:
    gem 'dotenv-rails', groups: [:development, :test]
    
  • Heroku生产环境要在控制台手动配置环境变量:
    heroku config:set RECAPTCHA_SITE_KEY=你的站点密钥 RECAPTCHA_SECRET_KEY=你的密钥
    

3. 验证Devise控制器里的逻辑是否正确

在app/controllers/users/sessions_controller.rb里,你的create动作逻辑要确保reCAPTCHA验证和登录流程正确绑定:

class Users::SessionsController < Devise::SessionsController
  def create
    # 用session存储登录失败次数
    session[:failed_login_attempts] ||= 0
    session[:failed_login_attempts] += 1
    
    @show_recaptcha = session[:failed_login_attempts] >= 3

    # 触发reCAPTCHA验证时,先校验再执行登录逻辑
    if @show_recaptcha && !verify_recaptcha
      build_resource(sign_in_params)
      resource.errors.add(:base, "reCAPTCHA验证失败,请重试")
      render :new
      return
    end

    super do |resource|
      # 登录成功后重置失败次数
      session[:failed_login_attempts] = 0
    end
  end
end

这里要注意:

  • verify_recaptcha默认会读取params[:g-recaptcha-response],如果你的表单修改了reCAPTCHA的字段名,要手动指定response: params[:你的字段名]
  • 验证失败时要手动给resource添加错误信息,然后渲染登录页面,不能直接调用super跳过校验
  • 登录成功后一定要重置失败次数,避免用户后续登录一直看到reCAPTCHA

4. 检查Google reCAPTCHA后台的域名配置

这是最容易忽略的细节:

  • 开发环境:如果你的Rails跑在localhost:3000,后台要添加localhost:3000(Google的域名匹配是严格的,端口不同算不同域名)
  • 生产环境:Heroku域名要写全,比如your-app-name.herokuapp.com,不要加http/https或路径

5. 手动测试Google的验证API

如果上面的都没问题,可以用curl手动调用验证接口,排查密钥或网络问题:

curl -X POST https://www.google.com/recaptcha/api/siteverify \
  -d "secret=你的SECRET_KEY&response=你从前端获取的g-recaptcha-response值"

如果返回{"success": true, ...},说明密钥和response有效,问题出在Rails代码里;如果返回success: false,看error-codes字段:比如missing-input-secret是密钥错误,invalid-input-response是response无效或域名不匹配。

6. 检查gem版本兼容性

确保recaptcha gem是最新版,和你的Rails、Devise版本兼容,Gemfile里可以指定:

gem 'recaptcha', require: 'recaptcha/rails'

然后运行bundle update recaptcha更新。

按照上面的步骤一步步排查,应该能找到问题所在。如果还是卡壳,可以把你的控制器代码、初始化文件代码贴出来,我再帮你细化分析~

内容的提问来源于stack exchange,提问作者ruby_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:26:35