Rails Devise集成Recaptcha时check_captcha不生效 验证码失败仍可登录
问题原因
check_captcha回调的判断逻辑完全颠倒:verify_recaptcha方法返回true代表人机校验通过,返回false代表校验失败。现有代码return if !verify_recaptcha的逻辑是校验失败时直接终止当前回调,继续执行后续的Devise登录逻辑,只有校验通过的时候才会走渲染登录页、阻止登录的代码,完全和预期逻辑相反,所以会出现校验失败依然能正常登录的问题。- 冗余的
flash.discard(:recaptcha_error)逻辑会清除校验失败的错误提示,导致用户看不到验证失败的反馈。
修复方案
- 修正
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
- 额外校验项:
- 确认当前使用的reCAPTCHA版本和代码匹配,v3版本必须传入对应action参数,避免出现校验逻辑异常。
- 确认生产环境使用的是正式reCAPTCHA密钥,不要误用开发环境的测试密钥,开发环境测试密钥默认会跳过校验。
内容的提问来源于stack exchange,提问作者user17130130
相关产品推荐
相关产品推荐

