1034 字
约 3 分钟
0
tianai-captcha 入门:行为验证码接入指南

tianai-captcha 入门:行为验证码接入指南

登录接口裸奔一晚上,脚本就能帮你把密码库撞穿。验证码是人机之间的第一道闸,这篇讲怎么用 tianai-captcha 把这道闸装上。

为什么需要行为验证码

传统的图形验证码(扭曲字母数字)有两个问题:对用户不友好(看不清、输错率高),对机器不再有效(OCR 识别率高得吓人)。行为验证码换了个思路——滑块拼图、点选文字,用户拖一下就完成验证,体验顺滑;而脚本要过这关,得模拟真实拖拽轨迹、图像识别缺口位置,成本一下子抬高几个数量级。

tianai-captcha 是国内开源的一款行为验证码组件,支持滑动拼图、旋转、滑动复原等多种玩法,提供 Spring Boot starter,后端生成校验数据和前端展示组件都齐了。

引入与配置

<dependency>
    <groupId>cloud.tianai.captcha</groupId>
    <artifactId>tianai-captcha-springboot-starter</artifactId>
    <version>1.4.1</version>
</dependency>

starter 引入后基本零配置可跑,常用配置:

tianai-captcha:
  # 验证码缓存前缀(配合 redis 时使用)
  prefix: captcha
  # 二次验证开关:第一次滑过之后换正式的加密校验,防重放
  secondary-validation: true
  background:
    url: https://example.com/captcha-bg/   # 自定义背景图目录

背景图可以直接用内置的,也可以放几张自己的图,滑动拼图的观感立刻个性化。

后端两步:生成 + 校验

第一步,生成验证码,返回给前端渲染:

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

    @Autowired
    private CaptchaService captchaService;

    @PostMapping("/generate")
    public Response<CaptchaVO> generate() {
        ImageCaptchaVO image = (ImageCaptchaVO) captchaService.generateCaptcha(
                ImageType.SLIDE_BLOCK.getValue());
        // image.id 和 image.backgroundImage 等返回给前端
        return Response.success(convert(image));
    }
}

第二步,校验。用户滑完,前端把滑动轨迹和位置提交上来:

@PostMapping("/check")
public Response<String> check(@RequestBody CaptchaCheckRequest req) {
    ImageCodeVO imageCode = buildImageCode(req);
    boolean match = captchaService.matching(imageCode);
    if (!match) {
        throw new BizException(ResponseCodeEnum.CAPTCHA_MISMATCH);
    }
    // 校验通过:发一个一次性 ticket,登录接口凭 ticket 免二次验证
    String ticket = issueOneTimeTicket();
    return Response.success(ticket);
}

这里有个防重放的关键设计:滑块坐标是固定答案,如果直接把「校验通过」当作登录凭证,攻击者拿到坐标参数就能无限重放。所以正确做法是校验通过后签发一个一次性、短时效的 ticket(通常存 Redis 60 秒),真正的登录接口只认 ticket。tianai 的 secondary-validation 机制就是干这个的。

前端接入

官方提供了对应的 JS 组件,引入后只要指定后端的生成/校验地址:

import TianAiCaptcha from 'tianai-captcha-js'

const captcha = new TianAiCaptcha({
  el: '#captcha-box',
  generateUrl: '/api/captcha/generate',
  checkUrl: '/api/captcha/check',
  onSuccess: (ticket) => {
    // 拿到 ticket,塞进登录请求,走真正的登录逻辑
    login(username, password, ticket)
  },
})
captcha.show()

用户体验路径:点登录 → 弹出滑块 → 滑对 → 登录成功。全程不离开当前页面。

生产环境三个提醒

背景图与安全的关系:滑动拼图的安全性部分来自缺口位置不可预测,背景图固定几张且被脚本扒走分析后,识别难度会下降,定期换图有实际意义。

频控仍然要有:验证码挡的是自动化批量行为,但人工肉鸡(打码平台)可以真人滑。登录接口该有的 IP 频控、账号失败锁定,一样都不能省。验证码是第一道闸,不是唯一一道。

无障碍与降级:滑块验证码对部分视障用户不友好,条件允许的话提供邮箱验证码等替代通道,别把真实用户挡在门外。

小结

tianai-captcha 的价值在于把「生成拼图、校验轨迹、防重放」这一整套打包成了 starter,后端十几行代码就有工业级的验证码能力。接入时记住核心链路:生成 → 前端滑 → 校验换一次性 ticket → ticket 走登录,顺序不能乱,重放攻击也就无机可乘。本站登录接口的人机校验就是这条链路在跑。

tianai-captcha 入门:行为验证码接入指南
http://www.clxhxhhr.top/posts/3708/
作者
clxstart
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。