Laravel 注册验证码gregwar/captcha

1. 安装 gregwar/captcha

图片验证码接口的流程是:

  • 生成图片验证码
  • 生成随机的 key,将验证码文本存入缓存。
  • 返回随机的 key,以及验证码图片

验证码 mews/captcha,对于网页应用来说,这个组件使用起来十分方便,但是它依赖 session,而且没法获取和设置验证码文本,不适用于 API 的用例。在 API 的开发中,我们将选择使用 gregwar/captcha 来完成图片验证码的功能。

$ composer require gregwar/captcha

file

2. 开发接口

1). 新建路由

接下来,先来增加图片验证码路由:

routes/api.php

.
.
.
// 用户注册
$api->post('users', 'UsersController@store')
    ->name('api.users.store');
// 图片验证码
$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);
        // $captcha->getPhrase(); 获取验证码:abcd
        \Cache::put($key, ['phone' => $phone, 'code' => $captcha->getPhrase()], $expiredAt);

        $result = [
            'captcha_key' => $key,
            'expired_at' => $expiredAt->toDateTimeString(),
            // $captcha->inline(); 将验证码转成 base64 图片
            'captcha_image_content' => $captcha->inline()
        ];

        return $this->response->array($result)->setStatusCode(201);
    }
}

3). 代码分解

分析一下代码:

  • 增加了 CaptchaRequest 要求用户必须通过手机号调用图片验证码接口。
  • controller 中,注入 CaptchaBuilder,通过它的 build 方法,创建出来验证码图片
  • 使用 getPhrase 方法获取验证码文本,跟手机号一同存入缓存。
  • 返回 captcha_key,过期时间以及 inline 方法获取的 base64 图片验证码

这里给图片验证码设置为 2 分钟过期,并且考虑到图片验证码比较小,直接以 base64 格式返回图片,大家可以考虑在这里返回图片 url,例如 http://larabbs.test/captchas/{captcha_key},然后访问该链接的时候生成并返回图片。

4). 测试一下

调试一下接口,可以先删除数据库中前几节测试创建的用户,因为手机号是 unique 的。删除成功后再次发送请求:\
file

\
请求成功,复制 captcha_image_content 的值,到浏览器中打开\

file

5). 验证验证码

验证的时候从缓存中取出来,然后与用户提交的验证码进行比较即可。

讨论数量: 0

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!