验证码的生成与校验
使用了 github.com/mojocn/base64Captcha
官方文档:https://mojotv.cn/go/refactor-base64-captcha
生成验证码
该库验证码有五种形式,数字、字符串、算术、音频
这里我使用的是算术形式的验证码,也可根据需要自己选择对应的验证码形式,配置参数可以到 https://captcha.mojotv.cn/ 这个网站进行调试
// 验证码默认存储对象,数量10240,有效时间10分钟
var store = base64Captcha.DefaultMemStore
// Math 配置参数
var (
Height = 70
Width = 240
NoiseCount = 0
ShowLineOptions = base64Captcha.OptionShowHollowLine
BgColor = &color.RGBA{
R: 144,
G: 238,
B: 144,
A: 10,
}
FontsStorage base64Captcha.FontsStorage
Fonts []string
)
// 生成验证码
func Captcha(c *gin.Context) {
// 这里用的是Math类型的验证码
driver := base64Captcha.NewDriverMath(Height, Width, NoiseCount, ShowLineOptions, BgColor, FontsStorage, Fonts)
captcha := base64Captcha.NewCaptcha(driver, store)
id, b64s, err := captcha.Generate()
if err != nil {
log.Fatal("验证码获取失败")
c.JSON(http.StatusBadRequest, gin.H{
"msg": "验证码获取失败",
})
return
}
c.JSON(http.StatusOK, gin.H{
"captchaId": id,
"captcha": b64s,
})
}
func main() {
r := gin.Default()
r.GET("captcha", Captcha)
r.Run(":8088")
}
可以测试一下,这里我用的是apifox
是可以得到一个json的,如下图
可以得到 base64和验证码id。根据base64 可以显示出来图片信息,把base64 放到 img标签 src属性即可显示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>练习</title>
<style>
</style>
</head>
<body>
<img src="base64">
</body>
</html>
如下图:
判断验证码是否输入正确
// 模拟登录效果,来验证验证码是否输入正确
func Login(c *gin.Context) {
var l LoginNeed
if err := c.ShouldBindJSON(&l); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "请求错误",
})
return
}
if store.Verify(l.CaptchaId, l.Captcha, true) {
c.JSON(http.StatusOK, gin.H{
"msg": "模拟登录成功",
})
}else {
c.JSON(http.StatusOK, gin.H{
"msg": "验证码错误",
})
}
}
func main() {
r := gin.Default()
r.GET("captcha", Captcha)
r.POST("login", Login)
r.Run(":8088")
}
还是用apifox
输入对应的json 数据
{
// 验证码答案
"captcha": "70",
// 验证码id
"captcha_id": "mR4kqDkNVSgurka7kFHM"
}
可以看到 已经验证通过了!