在网站登录时,需要增加一个验证码图片。不需要复杂的验证,简单的数字,或者英文字母验证即可。 找了一下发现一个 golang 的实现。
三方库
https://github.com/mojocn/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 格式的图片
},
})
}
生成的图片效果:
大小写问题
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
目前没有使用场景就没有测试,后续有机会尝试一下。(发送短信验证码时,可以加上)
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式