一个laravel验证码包

2023-11-01

说起验证码,尽管用户反感但还是挺需要的,以前的项目用自己写的基于GeeTest(极验)的 Laravel + Vue 组件,这次也考虑过reCaptcha的国内版,不过实在担心改版、收费及其它原因,所以自己用Laravel做一个吧。

这个包默认是用于SPA这种无状态下的响应,所以没有依赖Session,使用Session可以依照IStorage进行扩展,记得middleware使用web。

内置两个路由,一个获取验证码图像,返回一个base64的代码和一个身份标识;另一个进行验证。
提供简单的字符展示和数学计算两种,每种都支持Ascii(阿拉伯数字)和非Ascii(如中文),样子如下:
Ascii展示
非Ascii计算
阿拉伯数字计算
中文数字展示

用法

  • 获取验证码数据
axios
    .get('your_domain/api/v1/captcha/image')
    .then(response => (this.captcha = response.data))

返回

{
    "image": "data:image/png;base64,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",
    "validation": "f9cc27ee094dbb5024da2e9a103b3642"
}
  • 校验
axios
  .post('your_domain/api/v1/captcha/image', post_data)
  .then(response => (this.validation = response.data))

响应如下

{
    "message": "The captcha code input valid, please try again",
    "status": 403
}

使用配置文件可以方便的修改路由

    'router_api' => '/api/v1/captcha/image',

配置

源码中有比较细致的注释

    php artisan vendor:publish --tag=captcha
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Captcha router name
    |--------------------------------------------------------------------------
    |
    */
    'router' => '/api/v1/captcha/image',
    /*
    |--------------------------------------------------------------------------
    | Specify captcha generator.
    |--------------------------------------------------------------------------
    |
    */
    'generator' => \Tao\Captcha\Core\Generator\SimpleGenerator::class,

    /*
    |--------------------------------------------------------------------------
    | Specify code generator.
    |--------------------------------------------------------------------------
    |
    */
    'code' => \Tao\Captcha\Core\Code\CalculatorCode::class,

    'storage' => \Tao\Captcha\Core\Storage\CacheStorage::class,

    /*
   |--------------------------------------------------------------------------
   | Number type
   |--------------------------------------------------------------------------
   | ASCII number / Not ASCII number
   */
   //    'codeType' => [
   //        'chars' => '一二三四五六七八九',
   //        'isAscii' => false,
   //        'operations' => '加减乘' // if you use calculator-style, you need to add this (mapped to 'plus', 'minus', 'multiply')
   //    ],
    'codeType' => [
        'chars' => '1234567890',
        'isAscii' => true,
        'operations' => '+-*' // if you use calculator-style, you need to add this (mapped to 'plus', 'minus', 'multiply')
    ],

    /*
    |--------------------------------------------------------------------------
    | Font
    |--------------------------------------------------------------------------
    |
    */
    'font' => base_path('vendor/tao/captcha/src/resources/fonts/ximai.ttf'),

    /*
    |--------------------------------------------------------------------------
    | Font size
    |--------------------------------------------------------------------------
    | Font size in pixels.
    |
    */
    'fontSize' => 26,

    /*
    |--------------------------------------------------------------------------
    | Letter spacing
    |--------------------------------------------------------------------------
    | Spacing between letters in pixels.
    |
    */
    'letterSpacing' => 15,

    /*
    |--------------------------------------------------------------------------
    | Code Length
    |--------------------------------------------------------------------------
    */
    'length' => [4, 5],


    /*
    |--------------------------------------------------------------------------
    | Image Size
    |--------------------------------------------------------------------------
    | Captcha image size can be controlled by setting the width
    | and height properties.
    |
    |
    */
    'width' => 180,
    'height' => 50,

    /*
    |--------------------------------------------------------------------------
    | Background Captcha
    |--------------------------------------------------------------------------
    | You can specify an array or string.
    |
    */
    'background' => ['f9f4e0', 'd3dee0', 'f6f7f9'],

    /*
    |--------------------------------------------------------------------------
    | Colors characters
    |--------------------------------------------------------------------------
    | You can specify an array or string.
    |
    */
    'colors' => ['b8364f', '0390aa', '1b6aa8'],

    /*
    |--------------------------------------------------------------------------
    | Scratches
    |--------------------------------------------------------------------------
    | The number of scratches displayed in the Captcha.
    |
    */
    'scratches' => [3, 3],

];

文件结构

├── src
│   ├── CaptchaServiceProvider.php
│   ├── Controllers
│   │   └── CaptchaController.php
│   ├── Core
│   │   ├── Captcha.php
│   │   ├── Code
│   │   │   ├── AbstractCode.php
│   │   │   ├── CalculatorCode.php
│   │   │   └── SimpleCode.php
│   │   ├── Generator
│   │   │   ├── AbstractGenerator.php
│   │   │   ├── IGenerator.php
│   │   │   └── SimpleGenerator.php
│   │   ├── Helper.php
│   │   └── Storage
│   │       ├── CacheStorage.php
│   │       └── IStorage.php
│   ├── Facades
│   │   └── Captcha.php
│   ├── resources
│   │   ├── fonts
│   │   │   └── ximai.ttf
│   │   └── lang
│   │       ├── en
│   │       │   └── message.php
│   │       └── zh-CN
│   │           └── message.php
│   └── routes
│       └── api.php
├── tests
│   └── CaptchaTest.php

Github

欢迎到这里无情鼓励

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个laravel验证码包 的相关文章

  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查
  • 当路由不存在时重定向 laravel 4

    我正在使用 laravel 4 当我的项目处于生产模式时 我得到 抱歉 找不到您要查找的页面 当我到达一条不存在的路线时 当我 grep 我的代码时 它在两个地方找到 vendor symfony debug Symfony Compone
  • SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行(Laravel 6)

    我究竟做错了什么 环境 Laravel 6 Homestead 本地 Windows 10 创建外部表 迁移 Schema create external function Blueprint table table gt incremen
  • 如何从一行获取数据并移动到模态?拉拉维尔 5.4

    我有一个表 其中列出了数据库中的产品 其中包含 ID 名称 描述以及其他数据类型 我创建了一个按钮 该按钮将调用模态来显示有关产品的更多详细信息 但是模态始终显示表中第一个产品的详细信息 而不是与其相关的 ID 我的桌子 我的表代码 tab
  • 获取存储中文件的路径

    我使用以下方法将文件保存到存储中 request gt file avatar gt store avatars 将其保存到 storage app avatars avatar png 我怎样才能获得这个文件 文件夹的路径 not网址 使
  • Laravel 5.1 用户、角色和操作

    我正在使用 Laravel 5 1 创建一个应用程序users roles and actions 表设置如下 user id name 1 John Smith 2 Fred Smith role id name 1 Administra
  • Laravel 总结雄辩集

    如何对已预先加载的数据集求和 这是我的表结构 regions table Field Type Null Key Default Extra id int 10 unsigned NO PRI NULL
  • Yajra DataTable Laravel 中的 Foreach

    我试图在我的数据表中放入一个 foreach 循环 但它不起作用 附 如果我删除 foreach 一切都已经正常了 这里附上我的代码 Product Product query colors Color all return Datatab
  • RuntimeException - 会话存储未根据请求设置 - Laravel Socialite - Facebook

    我在用着Laravel 5 7 and Laravel Socialite 3 1 我想使用登录Facebook我刚刚为此项目配置了应用程序 这些是我为此配置的主要文件 env FACEBOOK CLIENT ID FACEBOOK CLI
  • Laravel 5 命名约定

    我对 Laravel 约定有点困惑 因为我是这个框架的新手 我正在关注 Jeffrey Way 他使用的 Laracasts 视频Plural对于控制器名称 E g 页面控制器 卡片控制器 帖子控制器 但如果我参考官方文档Laravel g
  • Laravel 4.2 Composer 安装错误:“无法扫描类”

    我想通过 Composer 在新的 Laravel 4 2 安装上安装一些软件包 但是 我遇到了例外 这是我的作曲家文件 name laravel laravel description The Laravel Framework keyw
  • Vue.js - 当标头中使用 multipart/form-data 时,axios 中的文件上传验证失败

    我正在构建一个 Laravel Vue js SPA 单页应用程序 BootstrapVue https bootstrap vue js org Vee验证 https logaretm github io vee validate gu
  • Laravel Blade 中的动态行数

    我想要像这样的表中有动态的行数 number name 1 Devy 这是我的 Blade 模板 thead th number th th name th thead tbody foreach aaa as value tr td td
  • 我需要在服务器上安装 Composer 吗?

    我正在尝试部署 Laravel 应用程序 想知道 Composer 是否需要单独安装在服务器上 不 您可以在单独的服务器上构建应用程序 或者在团队中工作时在开发计算机上不太理想 然后将项目 包括已安装的供应商 复制到您的服务器上 事实上 在
  • PHPUnit 和来自 Guzzle 的模拟请求

    我有一堂具有以下功能的课程 public function get string uri stdClass this gt client new Client response this gt client gt request GET u
  • Eloquent/Laravel 三路多对多关系

    我对 Laravel 和 Eloquent 是全新的 而且我对 ORM 的经验也很少 假设我有三个数据库表 Widgets Actions Users 我建模了一个连接表 其中包含以下列 widget id action id user i
  • 找不到类“App\Http\Controllers\Auth\User”

    我该如何解决这个 Laravel 错误 Class App Http Controllers Auth User not found 我正在为博客创建一个寄存器 并且使用以下内容 User create name gt request gt
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • 如何让 Laravel“确认”验证器将错误添加到确认字段?

    默认情况下 Laravel 确认 验证器将错误消息添加到原始字段 而不是通常包含确认值的字段 password gt required confirmed min 8 是否有任何简单的方法来扩展验证器或使用一些技巧来强制它始终在确认字段而不

随机推荐

  • 庖丁解牛-Resnet50 深度剖析,细致讲解,深入理解

    背景介绍 ResNet 50侧边输出形状 假设输入为352 则 output2 256x88x88 output3 512x44x44 output4 1024x22x22 output5 2048x11x11 VGG 16侧边输出形状 假
  • python使用onnx模型进行推理

    重点 本质结构重参数化 我们可以看到基于YoloV7训练的cfg有两种yaml文件 一个是training文件夹 一个是deploy文件夹 这两种文件夹有啥不一样呢 大家可以看下下面别人的issuse 记住这个很关键 就是你选择哪个yaml
  • STM32系列(HAL库) ——定时器编码器/正交解码模式

    STM32定时器的正交解码模式多用于检测电机的编码器脉冲数做闭环控制 如PID 本文简单介绍一下定时器在Cubemx如何配置以及程序引用到的API函数 一 前期准备 1 硬件 STM32C8T6最小系统板 USB TTL串口模块 ST Li
  • 基于Spring Boot+Vue的前后端分离实战项目

    点击 关注 爪哇笔记 给公众号标星置顶 更多精彩 第一时间直达 简介 基于Spring Boot Vue的后台管理系统 权限管理 字典 配置 定时任务 短信 邮件 根据excel模板导出 cms内容管理 手机端h5 IDEA 代码生成插件
  • word 2013 并列显示两张图片(且各自带有题注)

    两张要并排的图片均导入word中 调整t图片大小使得两图片刚好可以呈现在同一行 如果图片不需要题注 或者两图片共用一个题注 那么就此就可以了 而如果两图片各自要有题注 则继续进行如下操作 然后分别选中两张图片 即该操作对两张图片都要各做一次
  • Linux的多线程——生产者与消费者(条件变量、信号量)

    在这之前的文章中 我简单介绍了线程 初识线程 同步与互斥以及互斥锁 同步与互斥 现在我将在这篇文章中提到一种操作系统经常用到的模型 生产者与消费者模型 什么是生产者与消费者模型 在我看来 生产者与消费者模型是用来解决资源供求的问题 生产者与
  • 阿里禁用 boolean 类型变量用 isXxx 命名,why?

    作者 Apple Web 来源 blog csdn net belongtocode article details 100635246 平时工作中大家经常使用到boolean以及Boolean类型的数据 前者是基本数据类型 后者是包装类
  • 织梦列表页循环出来的数据显示乱码,但是头部及尾部分页完好的解决办法

    在用织梦二开的时候 突然就出现了乱码 用下面的方法 轻易解决问题 不用DW 也不用使用在线的任何编码工具 本人亲测有效 如果你用了我的办法还不行的话 请留言 我每天都会看csdn的 放心吧 我理解那种急于解决问题的心情 祝你顺利解决问题 无
  • 运动轨迹预处理

    运动轨迹预处理 相关名词 Trajectory preprocessing 轨迹预处理 time stamp 时间戳 sampled sampling 采样 figure 1 图1 policy 策略 threshold 阈值 该处理方式是
  • webpack5打包原理及应用(插件篇)

    webpack5打包原理及应用 插件篇 概念 loader 通常用来完成非JavaScript模块的转化成webpack能处理的模块 plugin 能够完成更多定制化操作的插件 如果想要插件起作用 需要在webpack config js中
  • java equals和==的区别

    String str1 abc String str2 abc String str3 new String abc String str4 new String abc 当 str1 str2 输出 true 当 str1 equals
  • linux下,Telnet连接输入正确的用户名和密码后,却还一直提示输用户名和密码,解决方案。

    先上图 1 确保telnet服务开启 服务器防火墙关闭状态 2 在 etc xinetd d telnet下 确认是否把 disable注释或者改为no 3 在 var log secure 下 查看日志 看一下是否有如下输出提示 pam
  • Keras载入mnist数据集出错问题解决方案

    找到本地keras目录下的mnist py文件 通常在这个目录下 Anaconda3 Lib site packages keras datasets 下载mnist npz文件到本地 下载链接如下 https pan baidu com
  • vcomp100.dll丢失怎样修复?5个靠谱的修复方法分享

    VCOMP100 DLL 是由微软打造的动态链接库 它对于一些图形密集型应用 例如Photoshop 以及多款知名游戏如巫师3的运行至关重要 如果操作系统在启动应用程序时无法找到此vcomp100 dll 则会出现vcomp100 dll丢
  • 【数据库系统概论(王珊)】第11章 并发控制

    多事务执行方式 串行执行 交叉并发方式 同时并发方式 为什么要进行并发控制 当多个用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况 若对并发操作不加控制就可能会存取和存储不正确的数据 破坏是事务的一致性和数据库的一致性 所以数据
  • TypeError: super(type, obj): obj must be an instance or subtype of type这个问题怎么处理?

    TypeError super type obj obj must be an instance or subtype of type这个问题怎么处理 这个错误通常发生在使用super 函数时 第二个参数不是第一个参数的实例或子类型 在使用
  • Python绘制多条y轴范围不同的曲线并在一张图上显示

    如何使用Python绘制多条y轴范围不同的曲线 然后把它们合并在一张图上显示 import matplotlib pyplot as plt import numpy as np def multilines target x ys typ
  • Sa-Token 一个轻量级Java权限认证框架

    文章目录 Sa Token 简介 基础使用 框架集成 添加Sa Token依赖 配置Sa Token 配置项解读 sa token cookie 单点登录 OAuth 2 0 登录认证 认证流程 登录与注销 其他操作语句 权限认证 获取当前
  • 程序次序规则

    程序次序规则 一个线程内 按照代码顺序 书写在前面的操作先行发生于书写在后面的操作 对于程序次序规则来说 我的理解就是一段程序代码的执行在单个线程中看起来是有序的 注意 虽然这条规则中提到 书写在前面的操作先行发生于书写在后面的操作 这个应
  • 一个laravel验证码包

    说起验证码 尽管用户反感但还是挺需要的 以前的项目用自己写的基于GeeTest 极验 的 Laravel Vue 组件 这次也考虑过reCaptcha的国内版 不过实在担心改版 收费及其它原因 所以自己用Laravel做一个吧 这个包默认是