一个开箱即用的滑动验证码React组件,基于[isszz/rotate-captcha]做的二次开发;结合了腾讯防水墙,增加安全策略,查看:设计思路
后端提供Laravel
扩展:levi/laravel-rotate-captcha
[查看],可直接使用或参考下方Api接口定制
以下演示全部都一样,分别展示了多主题,多语言、多个唤起方式;在不同的环境下的演示,可根据自己的情况选择一个环境查看演示和演示的代码
视频演示:
https://github.com/cgfeel/laravel-rotate-captcha/assets/578141/afa169d1-05c3-43d6-b7e7-cabaa8c5dbc5
Using NPM
npm install react-rotate-captcha
Using Yarn
yarn add react-rotate-captcha
Using PNPM
pnpm add react-rotate-captcha
通过status
唤起
import { useState } from 'react';
import RotateCaptcha from "react-rotate-captcha";
function App() {
const [open, setOpen] = useState(true);
return <RotateCaptcha open={open} onClose={() => setOpen(false)} />
}
通过Instance
唤起
import RotateCaptcha from "react-rotate-captcha";
function Page() {
const captcha = RotateCaptcha.useCaptchaInstance();
return (
<button onClick={() => captcha.open()}>click it</button>
);
}
function App() {
return (
<RotateCaptcha>
<Page />
</RotateCaptcha>
);
}
通过ref
唤起
import { useRef } from 'react';
import RotateCaptcha, { CaptchaInstance } from "react-rotate-captcha";
function App() {
const ref = useRef<CaptchaInstance>(null);
return (
<RotateCaptcha ref={ref}>
<button onClick={() => ref.current!.open()}>click it</button>
</RotateCaptcha>
);
}
更多请见下方Api
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
className | 验证浮窗顶层样式名,用于覆盖默认主题样式 | string |
- |
close | 自定义关闭按钮,设置null 屏蔽按钮 |
ReactNode │ null |
- |
lang | 语言,默认提供en 和zh_CN ,接受传入LangType 对象自定义语言 |
LangType │ string |
zh_CN |
limit | 试错次数,需要和服务端设置一致 | number |
2 |
mask | 自定义背景层,设置null 屏蔽背景层 |
ReactNode │ null |
- |
open | true 打开验证码,否则关闭 |
boolean |
- |
tips | 自定义底部提示 | ReactNode |
- |
theme | 提供两个主体dark 和light ,自定义主题通过自定义样式变量 |
string |
light |
zIndex | 浮窗样式层级 | number |
999 |
接受5个方法,只有onClose
和result
是同步函数,其余全部为异步函数
参数 | 说明 | 参数 | 返回值 |
---|---|---|---|
get | 初始获取验证码信息 | - | Promise<resultType<tokenType>> |
load | 提取tokenType 中的str 去换图片,返回图片URL 路径或图片base64 字符 |
path: string |
Promise<string> |
onClose | 关闭浮窗触发,以status 唤起的验证,必须提供onClose 来关闭 |
- | void |
result | 提取正确或错误的票据结果,可选,也可以通过verify 直接获取结果 |
info: resultType<ticketType> |
void |
verify | 滚动验证,返回票据信息 | token: string ,deg: number |
Promise<resultType<ticketType>> |
Api
接口,自行获取验证数据,组件内部不提供数据获取通过ref
或useCaptchaInstance
返回的Captcha
实例,接受3个方法,所有方法都返回void
,具体如下:
参数 | 说明 | 参数 |
---|---|---|
close | 关闭浮窗,参数force 默认值false ,设为true 将强制销毁验证浮窗 |
force?: boolean |
open | 打开浮窗 | - |
reload | 重新获取验证码图片 | - |
status
唤起的验证,不支持强制销毁通过useContent
提供上下文CaptchaContext
,方便自定义提示栏:
CurrentlyType: [0|1|2|3|4, string, boolean?]
,验证状态:
LangType
使用的语言:[查看]
captcha
,Captcha实例,如果只获取实例建议通过ref
或useCaptchaInstance
这里以开源的levi/laravel-rotate-captcha
(查看)举例,提供了5个接口(查看),请求参数和返回数据如下:
/rotate.captcha
GET
{ code: 0|1; msg: string; data: { ${str}: string } }
X-Captchatoken: ${token}
str
换image/rotate.captcha/${str}
GET
token
换ticket
/rotate.captcha/verify/${angle}/${token?}
GET
{ code: 0|1|2; msg: string; data?: { ${sid}: string; ${ticket}: string; } }
X-Captchatoken: ${token}
URL
中或req header
中的,至少有一处提供${token?}
/rotate.captcha/test/action
GET|POST
{ code: 0|1|2; msg: string; }
X-Captchasid: ${sid}; X-Captchaticket: ${ticket}; X-Captchapolicie?: ${police}
请求可以通过header
或POST formData
或POST raw
提交;安全策略police
根据服务器配置决定是否提交
当需要匹配不同尺寸的设备时,或者一些老的设备不支持webp
的情况下,通过这个接口获取定制的验证图片
/rotate.captcha
POST
{ size?: number; output?: 'jpg'|'png'|'webp' }
{ code: 0|1; msg: string; data: { ${str}: string } }
X-Captchatoken: ${token}
code
的状态:0.正常; 1.错误可继续; 2.错误重新开始; 注意:小于0的值为内部保留状态,请勿使用
如果安装后获取不到组件类型,请在tsconfig.json
的compilerOptions
添加如下引导:
"typeRoots": [
"./node_modules/@types"
]
安全策略详细见laravel-rotate-captcha
[查看],在提供允许的情况下,前端发送X-Captchapolici
这个header
,申请对应的权限。
高级用法:
ua
实际并不局限使用User-Agent
,可以通过自定义头部加密拼接增加安全系数encryption
的方式增加安全系数即时设计的向量稿件,包含组件设计规范:查看
具体请查看文档:更新日志
Laravel
扩展后端提供Laravel
扩展:levi/laravel-rotate-captcha
[查看],可直接使用或参考上方Api接口定制
第三方仓库,提供了react和laravel之外的生态扩展 [点击打开]
包含:
基于react实现的滑动验证码组件 [点击打开]