Laravel8注册页Google reCaptcha报验证码必填,同代码登录页正常
问题场景
基于Laravel 8开发用户注册页,已完成Google reCaptcha功能集成,相关代码与异常表现如下:
Blade 视图代码
<div class="form-group mt-5"> <div class="g-recaptcha" data-sitekey="sitekeytext"></div> </div> @error('g-recaptcha-response') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror
控制器校验代码
$request->validate([ 'g-recaptcha-response' => 'required', ], [ 'g-recaptcha-response.required' => 'Captcha is Required', ]);
异常表现
提交注册表单后,无论是否完成reCaptcha交互,后端始终返回「Captcha is Required」的校验错误提示:
关键参照条件:完全相同的reCaptcha代码在登录页可正常运行,无上述报错。
根因定位与解决方案
核心逻辑判断
校验始终提示“必填”,本质是后端接收到的请求参数中完全不存在g-recaptcha-response字段。由于相同代码在登录页运行正常,可排除reCaptcha脚本加载、站点密钥配置本身的问题,异常仅出在注册页独有的结构或逻辑上,常见触发原因包括:
- 表单结构错位:编写注册页视图时
<form>标签提前闭合,将reCaptcha容器写到了form标签外部。reCaptcha的校验值是通过动态生成的、带有name="g-recaptcha-response"属性的隐藏input存储的,不在form范围内的字段不会随表单一同提交,自然无法通过必填校验。 - 请求字段被过滤:若注册流程使用独立的FormRequest类做参数承接,类中定义的字段排除规则、或全局中间件的请求参数裁剪逻辑,将
g-recaptcha-response纳入了剔除范围,导致后端解析请求时找不到对应字段。 - 前端脚本冲突:注册页加载的第三方JS(如前端表单校验框架、自定义序列化插件)在提交环节拦截了请求,没有将reCaptcha字段纳入提交的参数集合中。
排查操作步骤
- 打开浏览器开发者工具的「网络」面板,触发注册表单提交,查看请求携带的Form Data内容:
- 若列表中完全没有
g-recaptcha-response字段:首先检查视图文件中form标签的闭合位置,将reCaptcha容器块挪到form的闭合标签内部;再检查注册流程的FormRequest类规则,将g-recaptcha-response加入允许接收的字段白名单。 - 若列表中存在
g-recaptcha-response字段但仍报必填错误:检查控制器逻辑,确认是否在执行校验前对请求参数做了修改(如手动重置参数集合、提前过滤字段),保证校验逻辑可正常从请求中读取到对应值。
- 若列表中完全没有
- 补充校验完整性:当前的校验规则仅判断字段是否存在,未校验验证码的实际有效性,存在被恶意构造请求绕过的风险,后续可补充与Google reCaptcha服务的远程校验逻辑,形成完整的校验闭环。
内容的提问来源于stack exchange,提问作者abu abu
相关产品推荐
相关产品推荐

