vue猫码Web前端之路

Node实现图形验证码

2020-11-07  本文已影响0人  ComfyUI

使用 svg-captcha 这个包并结合后端实现图形验证码功能。
项目地址:https://github.com/Ewall1106/mall

基本使用

$ npm install svg-captcha --save
const svgCaptcha = require('svg-captcha');

const captcha = svgCaptcha.create();
console.log(captcha);
// svgCaptcha.create(<OPTIONS>)
// eg:
svgCaptcha.create({
  size: 4, // 个数
  width: 100, // 宽
  height: 30, // 高
  fontSize: 38, // 字体大小
  color: true, // 字体颜色是否多变
  noise: 1, // 干扰线几条
  background: 'red', // 背景色
});

前端实现

// 显示获取的验证码
<div v-html="captchaSvg" />

// 获取图形验证码
getCaptcha() {
  getCaptcha().then((res) => {
    this.captchaSvg = res.entry
  })
}
# 安装uuid
$ npm install uuid
// 发送给后端
import { v4 as uuidv4 } from 'uuid';

let sid = uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

getCaptcha() {
  getCaptcha({ sid }).then((res) => {
    this.captchaSvg = res.entry
  })
}

后端实现

接收并缓存

async getCaptcha(ctx) {
  const captcha = svgCaptcha.create({
    width: 100,
    height: 30,
    fontSize: 38,
    color: false,
  });

  // 缓存key-value 并设置缓存有效期为10分钟
  setValue(sid, captcha.text, 10 * 60);

  ctx.body = {
    code: 200,
    entry: captcha.data,
  };
}

验证图形码

async login(ctx, next) {
  const { username, password, captcha, sid } = ctx.request.body;
  // 通过唯一标识符sid来获取缓存中图形验证码
  const value = await getValue(sid);
  if (!value) {
    ctx.body = {
      code: 400,
      message: '图形验证码已过期,请点击图片刷新',
    };
    return;
  }
  if (captcha.toLowerCase() !== value.toLowerCase()) {
    ctx.body = {
      code: 400,
      message: '请输入正确的验证码',
    };
    return;
  }
}
上一篇 下一篇

猜你喜欢

热点阅读