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

Rails Devise集成Recaptcha时check_captcha不生效 验证码失败仍可登录

问题原因
  • check_captcha回调的判断逻辑完全颠倒:verify_recaptcha方法返回true代表人机校验通过,返回false代表校验失败。现有代码return if !verify_recaptcha的逻辑是校验失败时直接终止当前回调,继续执行后续的Devise登录逻辑,只有校验通过的时候才会走渲染登录页、阻止登录的代码,完全和预期逻辑相反,所以会出现校验失败依然能正常登录的问题。
  • 冗余的flash.discard(:recaptcha_error)逻辑会清除校验失败的错误提示,导致用户看不到验证失败的反馈。
修复方案
  1. 修正check_captcha方法的判断逻辑,校验通过时直接放行,校验失败时拦截登录流程并返回错误提示,修正后的完整代码如下:
prepend_before_action :check_captcha, only: [:create]

def check_captcha
  # 校验通过直接放行,走后续登录逻辑
  return if verify_recaptcha 
  # 若使用reCAPTCHA v3版本,将上行代码改为 return if verify_recaptcha(action: 'login')

  self.resource = resource_class.new sign_in_params
  # 添加验证失败的错误提示
  resource.errors.add(:base, "人机验证失败,请重新尝试")
  respond_with_navigational(resource) do
    render :new
  end
end
  1. 额外校验项:
  • 确认当前使用的reCAPTCHA版本和代码匹配,v3版本必须传入对应action参数,避免出现校验逻辑异常。
  • 确认生产环境使用的是正式reCAPTCHA密钥,不要误用开发环境的测试密钥,开发环境测试密钥默认会跳过校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:03