Rails应用集成Devise与recaptcha gem后未向Google reCAPTCHA v3发送请求
问题根因
从请求日志可以看到,reCAPTCHA v3生成的校验token存放在g-recaptcha-response-data[login]/g-recaptcha-response-data[signup]参数中,而你使用的verify_recaptcha方法默认读取的是g-recaptcha-response参数,该参数值为空,导致校验逻辑直接判定失败,没有触发向Google reCAPTCHA服务的校验请求,因此你在控制台看不到新的请求记录。
解决方法
你可以任选以下两种方案之一修复:
方案一:修改视图配置(无需改控制器)
在视图的recaptcha_v3调用中添加flush: true参数,让生成的token直接写入g-recaptcha-response默认参数:
- 登录视图修改为:
<%= recaptcha_v3(action: 'login', flush: true) %> - 注册视图修改为:
<%= recaptcha_v3(action: 'signup', flush: true) %>
方案二:修改控制器校验逻辑(无需改视图)
在控制器的verify_recaptcha调用中手动指定读取token的参数路径:
- 登录控制器
SessionsController中check_captcha方法的校验语句修改为:
return if verify_recaptcha(action: 'login', response: params.dig('g-recaptcha-response-data', 'login'))
- 注册控制器
RegistrationsController中check_captcha方法的校验语句修改为:
return if verify_recaptcha(action: 'signup', response: params.dig('g-recaptcha-response-data', 'signup'))
额外检查项
确认你config/initializers/recaptcha.rb的初始化配置正确,使用的是reCAPTCHA v3对应的站点密钥和服务密钥,同时配置了合理的校验阈值:
Recaptcha.configure do |config| config.site_key = '你的v3站点密钥' config.secret_key = '你的v3服务密钥' config.minimum_score = 0.5 # 可根据业务需求调整阈值,范围0~1 end
内容的提问来源于stack exchange,提问作者Zorot
相关产品推荐
相关产品推荐

