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 协议》,转载必须注明作者和本文链接
老哥以后是要做 CTO 的人,这些技术怎么能不会呢?
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

表单验证里面 的 unique:users 指的是不能和users表中phone字段的值重复吗
如果users表中没有phone字段需要自己添加吗

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!