gong86627/laravel-slider-captcha

Laravel 滑动验证码扩展包

Maintainers

Package info

gitee.com/mumu9332/laravel-slider-captcha.git

pkg:composer/gong86627/laravel-slider-captcha

Statistics

Installs: 5

Dependents: 0

Suggesters: 0

v1.0.3 2026-03-17 02:51 UTC

This package is not auto-updated.

Last update: 2026-03-17 02:52:58 UTC


README

Laravel 滑动验证码扩展包。支持 Laravel 8+、PHP 8.0+。

功能特性

  • 自动定时任务:每日零点刷新背景图、每小时清理临时缓存
  • 手动命令:刷新背景图、清理临时图
  • 完整 API:生成、验证、图片鉴权、手动刷新/清理
  • 已验证 Token:验证成功后返回 verified_token,登录时携带校验
  • IP 频率限制:验证接口、图片接口单 IP 限流
  • IP 校验:验证时校验与生成时 IP 一致
  • 可配置:尺寸、存储路径、API 参数等

安装

composer require gong86627/laravel-slider-captcha

配置

首次执行任意 php artisan 命令时,若 config/slider-captcha.php 不存在,将自动发布到项目 config/ 目录。

也可手动发布:

php artisan vendor:publish --tag=slider-captcha-config

.env 中配置 Pixabay API Key(用于拉取背景图):

SLIDER_CAPTCHA_API_KEY=your-pixabay-api-key

获取免费 Key:https://pixabay.com/api/docs/

配置说明

config/slider-captcha.php

配置项说明默认值
width验证码宽度320
height验证码高度155
slider_w拼图块宽度65
slider_h拼图块高度65
block_l拼图主体边长42
block_r拼图圆弧半径10
distance_err位置误差(px)3
min_slide_time最小滑动时长(ms)600
max_slide_time最大滑动时长(ms)10000
ip_limit单IP每分钟验证次数(verify)5
image_ip_limit单IP每分钟图片请求次数20
cache_expire验证码有效期(秒)300
verified_token_expireverified_token 有效期(秒)60
verified_token_prefixverified_token 缓存前缀sliderverified
verify_ip_check登录校验 verified_token 时是否校验 IPtrue
verify_ip_match验证时是否校验 IP 与生成时一致true
tolerance验证容错像素8
x_marginX 最小值偏移(图宽-滑块宽-x_margin)100
save_path背景图存储路径slider_captcha/bg_images
temp_path临时图存储路径slider_captcha/temp
api_url背景图 API 地址https://pixabay.com/api/
api_keyAPI Key从 .env 读取
daily_count每日下载背景图数量50
per_request单次 API 请求数量10
request_delay请求间隔(秒)2
max_retry失败重试次数3
keywords背景图搜索关键词见配置文件
colorsPixabay 颜色过滤green,blue,brown,orange
route_prefix路由前缀slider-captcha
route_middleware路由中间件[]

前端流程

  1. 调用 GET /slider-captcha/generate 获取 token、背景图、拼图
  2. 用户完成滑动 → 调用 POST /slider-captcha/verify(传 token、puzzle_x、slide_time、track)
  3. 验证成功 → 保存返回的 data.verified_token
  4. 点击登录 → 请求登录接口,携带 accountpasswordverified_token

路由

安装后自动注册以下路由(前缀可配置):

方法路径说明
GET/slider-captcha/generate生成验证码
POST/slider-captcha/verify验证验证码
GET/slider-captcha/image/{token}图片访问(鉴权)
GET/slider-captcha/refresh-bg手动刷新背景图
GET/slider-captcha/clean-temp手动清理临时图

若需挂到 /api 下,设置 route_prefixapi/slider-captcha

定时任务

包会自动注册:

  • 每日 00:00:刷新背景图
  • 每小时:清理过期临时图

确保已配置 Laravel 调度器(crontab):

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

手动命令

# 刷新背景图
php artisan slider-captcha:refresh

# 清理临时图(默认 1 小时前)
php artisan slider-captcha:clean

# 清理 2 小时前的临时图
php artisan slider-captcha:clean --hours=2

API 使用

生成验证码

GET /slider-captcha/generate

响应:

{
  "code": 200,
  "msg": "生成成功",
  "data": {
    "token": "xxx",
    "bg_image_url": "/slider-captcha/image/xxx",
    "slide_image_url": "/slider-captcha/image/xxx",
    "captcha_width": 320,
    "captcha_height": 155,
    "slider_width": 65,
    "slider_height": 65,
    "slide_y": 45
  }
}

slide_y 为拼图块垂直位置,前端需据此设置拼图块的 top 样式。

验证验证码

POST /slider-captcha/verify
Content-Type: application/json

{
  "token": "xxx",
  "puzzle_x": 150,
  "slide_time": 1200,
  "track": [{"x": 0, "y": 0}, ...]
}

验证成功响应(含 verified_token,登录时携带):

{
  "code": 200,
  "msg": "验证成功",
  "data": {
    "verified_token": "xxx...",
    "puzzle_x": 150,
    "target_x": 150,
    "difference": 0,
    "tolerance": 8
  }
}

登录时校验 verified_token

在登录接口中,要求前端传入 verified_token,并调用包提供的静态方法校验:

use Gong86627\SliderCaptcha\SecureSliderCaptcha;

// 登录方法内
$verifiedToken = $request->input('verified_token');
$verifiedData = SecureSliderCaptcha::consumeVerifiedToken($verifiedToken);

if (!$verifiedData) {
    throw ValidationException::withMessages([
        'captcha' => ['验证码已过期或无效,请重新完成滑动验证'],
    ]);
}

// 可选:校验 IP 一致(config: verify_ip_check)
if (config('slider-captcha.verify_ip_check') && ($verifiedData['ip'] ?? '') !== $request->ip()) {
    throw ValidationException::withMessages([
        'captcha' => ['验证环境异常,请重新验证'],
    ]);
}

// 通过后继续校验账号密码...

前端集成

推荐使用 vue3-slide-verify,拼图形状已兼容。

bg_image_urlslide_image_url 拼上你的 API 根路径后传给组件即可。

License

MIT