Laravel 9 API对接CodeIgniter前端实现验证码验证方案咨询
解决方案
针对Laravel 9 API使用mews/captcha时因CSRF令牌导致验证失败的问题,推荐采用无状态验证码验证方案,具体步骤如下:
1. 调整mews/captcha配置
首先发布扩展的配置文件:
php artisan vendor:publish --provider="Mews\Captcha\CaptchaServiceProvider"
打开config/captcha.php,新增一个适用于API的配置项(或修改默认配置),使用request驱动替代默认的session驱动:
'api' => [ 'length' => 5, 'width' => 120, 'height' => 36, 'quality' => 90, 'math' => false, 'expire' => 60, // 验证码有效期(秒) 'driver' => 'request', // 无状态驱动,依赖缓存存储验证码数据 ],
2. 编写API验证码生成接口
在Laravel的API控制器中添加生成验证码的方法,返回验证码图片(base64格式)和对应的验证密钥:
use Mews\Captcha\Facades\Captcha; public function generateCaptcha() { $captcha = Captcha::create('api'); return response()->json([ 'captcha_image' => $captcha->inline(), // 返回base64图片,前端可直接渲染 'captcha_key' => $captcha->key // 验证时需要传递的密钥 ]); }
3. 前端CodeIgniter处理
前端调用上述接口获取captcha_image和captcha_key:
- 渲染
captcha_image给用户输入 - 登录时将
username、password、用户输入的captcha以及captcha_key一起发送到Laravel API
4. 修改验证规则
在登录接口的验证逻辑中,使用captcha_api规则并传入captcha_key进行验证:
$validator = Validator::make($request->all(), [ 'username' => 'required', 'password' => 'required', 'captcha' => 'required|captcha_api:' . $request->captcha_key ]); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 422); }
备选方案(不推荐)
如果坚持使用session驱动,可在CSRF中间件中排除API路由,同时处理跨域session传递:
- 修改
app/Http/Middleware/VerifyCsrfToken.php:
protected $except = [ '/api/*', // 替换为你的API路由前缀 ];
- 配置CORS允许携带Cookie,前端请求时需设置
withCredentials: true(仅适用于同域或信任的跨域场景,不符合RESTful无状态设计)
内容的提问来源于stack exchange,提问作者sabar djatmiko
相关产品推荐
相关产品推荐

