最近做了一个项目,需要用到给用户发送短信验证码,短信必然走的是第三方的服务。。 so 每一条都是收费的,所以在短信验证码之前,我们需要有一个图形验证码的验证来确定获取短信验证码的是一个人类 防止被人抓到接口无限刷-.-
由于机器环境的原因,没有选择
Redis
,图形验证码的结果保存方式为临时文件-.-
图形验证码的生成,是在npm上找到了一个感觉还可以的包 https://www.npmjs.com/package/svg-captcha
该包生成的是SVG格式的验证码,较其他的那些验证码有一个优势,基本不需要安装其他的什么依赖(c++之类的)。
而且生成后的数据也不太容易会被破解,因为图片中的文字是通过路径渲染的方式来画到SVG里的,而不是直接简单的一个<text></text>
我们会在接口调用时,生成一张验证码图片,并且生成一个uuid
来确保唯一性。
将uuid
作为文件名来创建一个临时文件,并在文件中写入验证码对应的正确答案。
然后将验证码图片&uuid
发送到前端。
希望GitHub能支持直接把SVG写到markdown里边去-.-
当前端获取到验证码,并且用户输入了对应的文本,我们需要做的就是验证是否正确。
验证接口会将UUID
和用户填写的验证码一并发过来。
mtime
)如果一致则将该文件的文本改为一个特定的字符串,以标识验证状态。 以上步骤中如果出现验证失败则直接将该验证码文件删除并返回结果。
这时我们应该已经拿到了走完前边的两个接口,这时我们手中的
UUID
就相当于是发送短信验证码接口调用的一个钥匙,当然是一次性的。
我们就可以拿着这个UUID
去做我们想做的事儿,比如发送一个短信验证码-.-
将UUID
携带到请求的参数中,server就可以通过该UUID
来判断请求的有效性。
node
依赖fs
用来操作临时文件(创建删除查找)svg-captcha
用来生成验证码node-uuid
用来生成不重复的唯一ID因为每次创建一个验证码都会创建一个临时文件,虽说这个文件在验证过期后会进行删除,但是很难保证接口不会被恶意刷,导致服务器磁盘被临时文件撑满。
所以我们在这边使用了crontab
,定时每分钟清理一下五分钟前的文件来防止上述情况:
find XXX/tmp/ -mmin +5 -name "*.tmp" | xargs rm -rf