如何用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}`); });
使用说明
- 前端先调用
GET /captcha接口,直接将返回内容作为图片的src属性展示即可 - 用户输入验证码后,将验证码内容作为
captcha参数随其他业务参数一起提交到POST /get-business-data接口 - 校验通过后即可拿到业务数据
优化建议
- 生产环境请将session存储到Redis、MongoDB等持久化服务中,避免进程重启导致session丢失
- 可以额外在session中存储验证码生成时间,校验时判断是否超过有效期,双重保证
- 可根据需求调整验证码的字符长度、干扰线数量、字体大小等参数,提升防机器识别能力
内容的提问来源于stack exchange,提问作者sinammd
相关产品推荐
相关产品推荐

