You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js(Express框架)实现无第三方CAPCHA的图片数字校验接口

Express 无第三方服务实现验证码接口方案

整体实现逻辑

  • 第一步:提供GET接口生成随机数字验证码,将验证码明文存入用户session,同时返回验证码图片
  • 第二步:提供POST接口接收用户提交的验证码,和session中存储的内容比对,校验通过后返回业务数据

前置依赖安装

我们使用纯Node实现的svg-captcha库生成验证码,不需要依赖系统图形组件,也不用调用第三方服务,安装命令:

npm install express express-session svg-captcha

完整实现代码

const express = require('express');
const session = require('express-session');
const svgCaptcha = require('svg-captcha');
const app = express();

// 配置session,生产环境建议将session存储到redis等持久化存储中,不要用默认内存存储
app.use(session({
  secret: 'your_custom_secret_key_here', // 替换为你自己的密钥
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 5 * 60 * 1000 } // 验证码有效期5分钟
}));

// 解析POST请求的JSON参数
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 配置验证码生成参数
const captchaConfig = {
  size: 4, // 验证码字符长度
  ignoreChars: '0o1il', // 排除易混淆字符
  noise: 3, // 干扰线数量
  color: true, // 字符是否有颜色
  background: '#f0f0f0' // 背景色
};

// 1. 获取验证码的GET接口
app.get('/captcha', (req, res) => {
  const captcha = svgCaptcha.create(captchaConfig);
  // 将验证码内容存入用户session,转成小写实现大小写不敏感校验
  req.session.captcha = captcha.text.toLowerCase();
  // 设置返回内容类型为svg图片
  res.type('image/svg+xml');
  res.send(captcha.data);
});

// 2. 校验验证码并返回业务数据的POST接口
app.post('/get-business-data', (req, res) => {
  const userInput = (req.body.captcha || '').toLowerCase();
  // 校验验证码是否存在且匹配
  if (!req.session.captcha) {
    return res.status(400).json({ code: 400, msg: '验证码已过期,请重新获取' });
  }
  if (userInput !== req.session.captcha) {
    return res.status(400).json({ code: 400, msg: '验证码输入错误' });
  }
  // 校验通过,销毁已使用的验证码,防止重复提交
  req.session.captcha = null;
  // 返回业务数据,这里替换为你自己的业务逻辑
  res.json({
    code: 200,
    msg: '校验通过',
    data: {
      // 你的业务数据内容
    }
  });
});

// 启动服务
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`服务运行在 http://localhost:${PORT}`);
});

使用说明

  1. 前端先调用GET /captcha接口,直接将返回内容作为图片的src属性展示即可
  2. 用户输入验证码后,将验证码内容作为captcha参数随其他业务参数一起提交到POST /get-business-data接口
  3. 校验通过后即可拿到业务数据

优化建议

  • 生产环境请将session存储到Redis、MongoDB等持久化服务中,避免进程重启导致session丢失
  • 可以额外在session中存储验证码生成时间,校验时判断是否超过有效期,双重保证
  • 可根据需求调整验证码的字符长度、干扰线数量、字体大小等参数,提升防机器识别能力

内容的提问来源于stack exchange,提问作者sinammd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 18:33:01