接口防刷,golang 生成数字验证码图片,基于 base64Captcha

文章目录

    在网站登录时,需要增加一个验证码图片。不需要复杂的验证,简单的数字,或者英文字母验证即可。
    找了一下发现一个 golang 的实现。

    三方库

    https://github.com/mojocn/base64Captcha

    效果如下:

    golang 生成图片验证码,基于 base64Captcha

    支持:

    • 数字验证码
    • 公式
    • 字母
    • 汉字
    • 音频

    安装

    > go get -u github.com/mojocn/base64Captcha
    

    生成验证码图片

    实际上是生成了一个 base64 格式的图片,测试了一下,大小为 1K 左右。

    以 golang gin 框架为例:

    import "github.com/mojocn/base64Captcha"
    
    var captchaStore = base64Captcha.DefaultMemStore
    
    func GetCaptcha(c *gin.Context) {
    	driver := base64Captcha.DefaultDriverDigit
    	captcha := base64Captcha.NewCaptcha(driver, captchaStore)
    	id, b64s, _, _ := captcha.Generate()
    	//fmt.Println(id)
    	c.JSON(http.StatusOK, gin.H{
    		"err_code": 0,
    		"err_msg":  "OK",
    		"data": gin.H{
    			"captchaId": id,
    			"image":     b64s,   // base64 格式的图片
    		},
    	})
    }
    

    生成的图片效果:

    base64 图片数字验证码

    大小写问题

    https://github.com/mojocn/base64Captcha/issues/127

    从反馈的 github issue 看,确实存在字母大小写不易分辨的问题。我觉得先不使用字母,仅仅用数字即可。
    毕竟,目前这个网站没有被刷的价值。

    过期时间

    为了方便部署,我选择了默认的内存存储。而没有采用 redis。
    但是在内存中,总不能一直占用内存吧。需要确认一下是否有自动的清理机制。

    查看源代码文件 store_memory_default.go 可以看到:

    package base64Captcha
    
    import "time"
    
    var (
    	// GCLimitNumber The number of captchas created that triggers garbage collection used by default store.
    	GCLimitNumber = 10240
    	// Expiration time of captchas used by default store.
    	Expiration = 10 * time.Minute
    	// DefaultMemStore is a shared storage for captchas, generated by New function.
    	DefaultMemStore = NewMemoryStore(GCLimitNumber, Expiration)
    )
    

    存储总数量,和过期时间(10分钟),都做了默认设置。

    一个 captcha id 是否会被重复使用

    主要是为了防止校验通过的 captcha 被重复使用。

    // 校验验证码
    verify := captchaStore.Verify(request.CaptchaId, request.Captcha, true)
    

    第三个参数,就是 clear 标识。即,调用校验接口之后,是否清理对应的验证码。

    实际测试发现,无论校验是否成功,都会清除对应的验证码。非常好,是合理的。

    更多有趣的库

    搜索 golang captcha 会发现,还有不少实现,甚至类似于 google recaptcha 的实现。例如:

    https://github.com/wenlng/go-captcha

    golang captcha

    目前没有使用场景就没有测试,后续有机会尝试一下。(发送短信验证码时,可以加上)

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式