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 协议》,转载必须注明作者和本文链接
表单验证里面 的 unique:users 指的是不能和users表中phone字段的值重复吗
如果users表中没有phone字段需要自己添加吗