node从入门到放弃系列之(10)图形验证功能

奉上代码: node服务demo代码=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码
如果git登不上可以换gitee=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码

这里展示的是基于nodejs的人机验证接口和vue的前端验证案例
有需要基于uniapp的验证案例的点这里,在components里。
有需要基于java的接口案例的点这里
前端案例灵感来源及参考:安全验证案例

后端接口

数据获取

这部分使用的是canvas画布的部分功能。

滑块拼图图片数据

需要一个拼图块和背景图,效果图如下:
拼图块及背景图
代码有点长,直接上链接,git上看更方便=》/image/verify接口
swagger文档

点击文字图片数据

需要一张带有文字的图片。效果图如下:
在这里插入图片描述
代码地址和swagger跟上面的一样

验证

代码有点长,直接上链接,详细的git上看更方便=》/image/check接口

滑块拼图验证

这部分很简单,把前端传来的移动距离和后端保存的距离比较下就行了。

  // 滑块验证
  const R = 16; // 根据字体大小计算得到:22px R = Math.round(2 * 11^2)
  const sql = `select * from captcha where user_id='${token.id}' and type='0'`;
  const sqlResult = await mysql.query(sql);
  const sliderLeft = Number(sqlResult[0].check_json); // 获取保存的滑块移动距离
  checkJson = Number(checkJson) + 4;
  Math.abs(checkJson - sliderLeft) < 4 ? (result = true) : (result = false);

文字点击验证

这部分最难的就是文字中心重置部分了,因为文字加上的旋转,所以比较时的中心应该跟着改变

 // 点击验证
 checkJson = JSON.parse(checkJson);
 const sql = `select * from captcha where user_id='${token.id}' and type='1'`;
 const sqlResult = await mysql.query(sql);
 position = JSON.parse(sqlResult[0].check_json);

 // 中心坐标重置
 for (const i in position) {
   const element = position[i];
   const radian = ((element.angle + 45) * PI) / 180;
   if (element.angle > 45) {
     position[i].X -= Math.round(R * Math.cos(radian));
     position[i].Y += Math.round(R * Math.sin(radian));
   } else if (element.angle < -45) {
     position[i].X += Math.round(R * Math.sin(radian));
     position[i].Y -= Math.round(R * Math.cos(radian));
   } else {
     position[i].X += Math.round(R * Math.sin(radian));
     position[i].Y -= Math.round(R * Math.cos(radian));
   }
   const dx = Math.abs(position[i].X - checkJson[i].x);
   const dy = Math.abs(position[i].Y - checkJson[i].y);
   const distance = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
   if (distance > 18) {
     return ctx.success(false);
   } else if (i == position.length - 1) {
     result = true;
   }
 }

因为旋转的时候我限定了只能-90到90度之间旋转,所以只需要判断三种情况,如果度数修改,判断情况也要跟着修改。
中心点重置主要根据三角函数,距离判断根据两点间距离公式,初中数学啦,不懂的拿个🖊那张纸画个坐标轴算一个就知道了,还不懂可以评论私信我手把手教学,更省事的直接代码CV走就好了。

前端案例

前部分案例就不是上面两种了,还有两种不需要后端配合的数字验证码及滑动条验证。先上代码=》人机验证前端案例,使用文档看md文件。
代码看git,就直接上效果图了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

弹出式:
在这里插入图片描述
这样人机验证的前后端就都好了

几个问题

  • 滑块的样式或者是判断还不完美,有时候会超出一点,前端的锅
  • 后端存储的验证数据只是最新一次的,所以同页面有两个滑块验证的话第一个的第一次验证总是错的,不想改,正常没人这么干。
  • 案例里可能还有一些我没发现的不足,有发现的可以评论区留言我修改下,谢谢!

上一篇:node从入门到放弃系列之(9)koa2 log日志输出
下一篇:node从入门到放弃系列之(11)用优雅的代码武装我们的koa2项目

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值