记一个node实现的图形验证码从0到1

记一个node实现的图形验证码从0到1

最近做了一个项目,需要用到给用户发送短信验证码,短信必然走的是第三方的服务。。 so 每一条都是收费的,所以在短信验证码之前,我们需要有一个图形验证码的验证来确定获取短信验证码的是一个人类 防止被人抓到接口无限刷-.-

整体流程的说明

由于机器环境的原因,没有选择Redis,图形验证码的结果保存方式为临时文件

  1. 生成验证码
  2. 验证有效性
  3. 验证成功&发送短信验证码

图形验证码的生成

图形验证码的生成,是在npm上找到了一个感觉还可以的包 https://www.npmjs.com/package/svg-captcha

该包生成的是SVG格式的验证码,较其他的那些验证码有一个优势,基本不需要安装其他的什么依赖(c++之类的)。 而且生成后的数据也不太容易会被破解,因为图片中的文字是通过路径渲染的方式来画到SVG里的,而不是直接简单的一个<text></text>

我们会在接口调用时,生成一张验证码图片,并且生成一个uuid来确保唯一性。 将uuid作为文件名来创建一个临时文件,并在文件中写入验证码对应的正确答案。 然后将验证码图片&uuid发送到前端。

效果示意

希望GitHub能支持直接把SVG写到markdown里边去-.-

验证码有效性的验证

当前端获取到验证码,并且用户输入了对应的文本,我们需要做的就是验证是否正确。

验证接口会将UUID和用户填写的验证码一并发过来。

  1. 检查文件是否有效
    1. 判断文件是否存在
    2. 判断文件是否过期(通过判断文件的mtime
  2. 取出该文件对应的答案与用户输入的验证码进行对比

如果一致则将该文件的文本改为一个特定的字符串,以标识验证状态。 以上步骤中如果出现验证失败则直接将该验证码文件删除并返回结果。

验证完成后的使用

这时我们应该已经拿到了走完前边的两个接口,这时我们手中的UUID就相当于是发送短信验证码接口调用的一个钥匙,当然是一次性的。

我们就可以拿着这个UUID去做我们想做的事儿,比如发送一个短信验证码-.- 将UUID携带到请求的参数中,server就可以通过该UUID来判断请求的有效性。

小结

该业务逻辑中所使用的一些node依赖

  1. fs 用来操作临时文件(创建删除查找)
  2. svg-captcha 用来生成验证码
  3. node-uuid 用来生成不重复的唯一ID

后续的一些补充

因为每次创建一个验证码都会创建一个临时文件,虽说这个文件在验证过期后会进行删除,但是很难保证接口不会被恶意刷,导致服务器磁盘被临时文件撑满。

所以我们在这边使用了crontab,定时每分钟清理一下五分钟前的文件来防止上述情况:

find XXX/tmp/ -mmin +5 -name "*.tmp" | xargs rm -rf

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刘望舒

Android响应式编程(一)RxJava前篇[入门基础]

1.RxJava概述 ReactiveX与RxJava 在讲到RxJava之前我们首先要了解什么是ReactiveX,因为RxJava是ReactiveX的一种...

25450
来自专栏Java3y

HTTP2和HTTPS来不来了解一下?

试想一下:请求一张图片,新开一个连接,请求一个CSS文件,新开一个连接,请求一个JS文件,新开一个连接。HTTP协议是基于TCP的,TCP每次都要经过三次握...

10600
来自专栏一名合格java开发的自我修养

HTTP协议下保证密码不被获取更健壮方式

说到在http协议下用户登录如何保证密码安全这个问题:     小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把...

13920
来自专栏阮一峰的网络日志

GPG入门教程

前两篇文章,我介绍了RSA算法。 今天,就接着来看,现实中怎么使用这个算法,对信息加密和解密。这要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密...

40670
来自专栏程序猿DD

Spring Cloud构建微服务架构:分布式配置中心(加密解密)

最近正好想发一篇关于配置中心加密的细节内容,结果发现基础的加密解密居然漏了,所以在这个入门系列中补充一下。后面再更新一下,使用配置中心的一些经验和教训。 ? 在...

38470
来自专栏Web行业观察

关于搭建HTTPS服务...

关于 HTTPS 的基本原理大家都已经不再陌生,今天和大家说说如何搭建一个支持 HTTPS 的服务端。

48640
来自专栏禹都一只猫博客

certbot免费SSL证书申请部署

33030
来自专栏Golang语言社区

Go语言·Web调优详解

Go1.8将要来了,这种格局即将被打破了! 我们最近尝试性的将Go1.8编译的服务暴漏到了外网,结果发现crypto/tls 和net/http都得到了极大的提...

39990
来自专栏Java后端技术栈

前后端分离后API交互如何保证数据安全性?

前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是webapp还是PC端的软件,只要...

52010
来自专栏晓晨的专栏

获取 Let's Encrypt 免费通配符证书实现Https

49030

扫码关注云+社区

领取腾讯云代金券