Laravel - 验证码 - API
API 项目适用的图片验证码
1. 安装 gregwar/captcha
图片验证码接口的流程是:
- 生成图片验证码
- 生成随机的 key,将验证码文本存入缓存。
- 返回随机的 key,以及验证码图片
mews/captcha,对于网页应用来说,这个组件使用起来十分方便,但是它依赖 session,而且没法获取和设置验证码文本,不适用于 API 的用例。在 API 的开发中,我们将选择使用 gregwar/captcha 来完成图片验证码的功能。
# 不限于 laravel 普通 php 项目也可以使用额 $ composer require gregwar/captcha 2. 开发接口
1). 新建路由
接下来,先来增加图片验证码路由:
routes/api.php
. . . // 图片验证码 $api->post('captchas', 'CaptchasController@store') ->name('api.captchas.store'); 2). 新建控制器和表单验证类
创建 CaptchasController 以及 CaptchaRequest
$ php artisan make:controller Api/CaptchasController $ php artisan make:request Api/CaptchaRequest 修改文件如下
app/Http/Requests/Api/CaptchaRequest.php
<?php namespace App\Http\Requests\Api; use Dingo\Api\Http\FormRequest; class CaptchaRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'phone' => 'required|regex:/^1[34578]\d{9}$/|unique:users', ]; } } app/Http/Controllers/Api/CaptchasController.php
<?php namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use Gregwar\Captcha\CaptchaBuilder; use App\Http\Requests\Api\CaptchaRequest; class CaptchasController extends Controller { public function store(CaptchaRequest $request, CaptchaBuilder $captchaBuilder) { $key = 'captcha-'.str_random(15); $phone = $request->phone; $captcha = $captchaBuilder->build(); $expiredAt = now()->addMinutes(2); \Cache::put($key, ['phone' => $phone, 'code' => $captcha->getPhrase()], $expiredAt); $result = [ 'captcha_key' => $key, 'expired_at' => $expiredAt->toDateTimeString(), 'captcha_image_content' => $captcha->inline() ]; return $this->response->array($result)->setStatusCode(201); } } 代码分析
use Gregwar\Captcha\CaptchaBuilder;- 创建验证码实例:
$captcha = $captchaBuilder->build(); - 获取验证码值:
$captcha->getPhrase();// abcd... - 获取验证码图片的
base64:$captcha->inline()// base64 xxxxx
3). 代码分解
分析一下代码:
- 增加了
CaptchaRequest要求用户必须通过手机号调用图片验证码接口。 controller中,注入CaptchaBuilder,通过它的build方法,创建出来验证码图片- 使用
getPhrase方法获取验证码文本,跟手机号一同存入缓存。 - 返回
captcha_key,过期时间以及inline方法获取的base64图片验证码
这里给图片验证码设置为 2 分钟过期,并且考虑到图片验证码比较小,直接以 base64 格式返回图片,大家可以考虑在这里返回图片 url,例如 http://larabbs.test/captchas/{captcha_key},然后访问该链接的时候生成并返回图片。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
表单验证里面 的 unique:users 指的是不能和users表中phone字段的值重复吗
如果users表中没有phone字段需要自己添加吗
可以把时间从 $expiredAt->toDateTimeString(), 修改成 $expiredAt
这样和现在默认的格式一至,然后前端返回给服务端通过$request->date获取