golang,go,博客,开源,编程
今天要介绍的库 mojocn/base64Captcha
是一个用于 Go 语言的高效验证码生成库,支持图片、音频等多种验证码格式,并且可以通过 base64
编码输出,方便前端直接使用。该库广泛用于 Web 应用、REST API 以及需要身份验证的系统中,以增强安全性。
Driver
接口扩展自定义的验证码格式。base64Captcha.DefaultMemStore
)。base64
字符串,前端可以通过 img
标签或 audio
标签直接显示。store.Verify(id, answer, clear)
方法校验用户输入,并可选择是否自动清除已验证的验证码。在 Go 项目中安装 base64Captcha
:
go get -u github.com/mojocn/base64Captcha
package main
import (
"fmt"
"github.com/mojocn/base64Captcha"
)
func main() {
// 配置数字验证码
driver := base64Captcha.DriverDigit{
Height: 80, // 高度
Width: 240, // 宽度
CaptchaLen: 6, // 验证码长度
MaxSkew: 0.7, // 形变幅度
DotCount: 80, // 干扰点数量
}
store := base64Captcha.DefaultMemStore // 默认存储器(内存)
captcha := base64Captcha.NewCaptcha(driver.ConvertFonts(), store)
id, b64s, answer, err := captcha.Generate() // 生成验证码
if err != nil {
fmt.Println("生成验证码失败:", err)
return
}
fmt.Println("验证码 ID:", id)
fmt.Println("Base64 编码:", b64s)
fmt.Println("验证码答案:", answer)
}
说明:
id
、Base64 编码的图片数据和答案。b64s
可直接插入 HTML
:
<img src="data:image/png;base64, {b64s}">
package main
import (
"fmt"
"github.com/mojocn/base64Captcha"
)
func main() {
// 配置字符验证码
driver := base64Captcha.DriverString{
Height: 60,
Width: 240,
ShowLineOptions: 2 | 4,
NoiseCount: 5,
Length: 6,
Source: "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
FontSize: 42,
MaxSkew: 0.3,
}
store := base64Captcha.DefaultMemStore
captcha := base64Captcha.NewCaptcha(driver.ConvertFonts(), store)
id, b64s, answer, err := captcha.Generate()
if err != nil {
fmt.Println("生成验证码失败:", err)
return
}
fmt.Println("验证码 ID:", id)
fmt.Println("Base64 编码:", b64s)
fmt.Println("验证码答案:", answer)
}
说明:
ShowLineOptions
控制干扰线条:
2
:水平干扰线4
:垂直干扰线2 | 4
(默认):水平 + 垂直干扰线package main
import (
"fmt"
"github.com/mojocn/base64Captcha"
)
func main() {
driver := base64Captcha.DriverMath{
Height: 80,
Width: 240,
NoiseCount: 5,
ShowLineOptions: 2 | 4,
FontSize: 42,
MaxSkew: 0.5,
}
store := base64Captcha.DefaultMemStore
captcha := base64Captcha.NewCaptcha(driver.ConvertFonts(), store)
id, b64s, answer, err := captcha.Generate()
if err != nil {
fmt.Println("生成验证码失败:", err)
return
}
fmt.Println("验证码 ID:", id)
fmt.Println("Base64 编码:", b64s)
fmt.Println("验证码答案:", answer)
}
说明:
// 验证用户输入的验证码
func verifyCaptcha(id, userInput string) bool {
return base64Captcha.DefaultMemStore.Verify(id, userInput, true)
}
说明:
id
:验证码 ID。userInput
:用户输入的验证码。true
:验证成功后是否清除验证码。以下是一个 完整的 REST API 示例,提供生成和校验验证码的接口:
package main
import (
"encoding/json"
"github.com/mojocn/base64Captcha"
"log"
"net/http"
)
// 全局存储
var store = base64Captcha.DefaultMemStore
// 生成验证码 API
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
driver := base64Captcha.DriverDigit{Height: 80, Width: 240, CaptchaLen: 5, MaxSkew: 0.7, DotCount: 80}
captcha := base64Captcha.NewCaptcha(driver.ConvertFonts(), store)
id, b64s, _, err := captcha.Generate()
if err != nil {
http.Error(w, "生成验证码失败", http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(map[string]string{"id": id, "captcha": b64s})
}
// 校验验证码 API
func verifyCaptchaHandler(w http.ResponseWriter, r *http.Request) {
var requestData struct {
ID string `json:"id"`
Value string `json:"value"`
}
json.NewDecoder(r.Body).Decode(&requestData)
valid := store.Verify(requestData.ID, requestData.Value, true)
json.NewEncoder(w).Encode(map[string]bool{"valid": valid})
}
func main() {
http.HandleFunc("/captcha/generate", generateCaptchaHandler)
http.HandleFunc("/captcha/verify", verifyCaptchaHandler)
log.Println("服务器启动,监听端口 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
说明:
/captcha/generate
生成验证码并返回 base64
图片和 id
。/captcha/verify
校验用户提交的验证码。