golang 每日一庫之 base64Captcha
今天要介紹的庫 mojocn/base64Captcha
是一個用於 Go 語言的高效驗證碼生成庫,支持圖片、音頻等多種驗證碼格式,並且可以通過 base64
編碼輸出,方便前端直接使用。該庫廣泛用於 Web 應用、REST API 以及需要身份驗證的系統中,以增強安全性。
主要功能
- 支持多種驗證碼類型
-
數字驗證碼
(DriverDigit):僅包含數字,適用於一般驗證碼場景。
-
字符驗證碼
(DriverString):包含數字、大小寫字母,支持自定義複雜度。
-
算術驗證碼
(DriverMath):計算數學表達式(加減乘除),提高安全性。
-
音頻驗證碼
(DriverAudio):對視力受限的用戶友好。
-
自定義驗證碼
:可通過
Driver
接口擴展自定義的驗證碼格式。
- 內存存儲與 Redis 存儲支持
-
默認使用 內存存儲(
base64Captcha.DefaultMemStore
)。 -
支持 Redis 作爲存儲後端,便於多服務器環境下共享驗證碼狀態。
- 驗證碼 Base64 編碼
- 生成的驗證碼圖片或音頻可直接轉換爲
base64
字符串,前端可以通過img
標籤或audio
標籤直接顯示。
- 驗證碼校驗
- 提供
store.Verify(id, answer, clear)
方法校驗用戶輸入,並可選擇是否自動清除已驗證的驗證碼。
安裝
在 Go 項目中安裝 base64Captcha
:
go get -u github.com/mojocn/base64Captcha
使用示例
1. 生成數字驗證碼
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}">
2. 生成字符驗證碼
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
(默認):水平 + 垂直干擾線
3. 生成數學驗證碼
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)
}
說明:
- 該代碼生成 數學驗證碼,要求用戶解答數學運算,提高防 bot 效果。
4. 校驗驗證碼
// 驗證用戶輸入的驗證碼
func verifyCaptcha(id, userInput string) bool {
return base64Captcha.DefaultMemStore.Verify(id, userInput, true)
}
說明:
-
id
:驗證碼 ID。
-
userInput
:用戶輸入的驗證碼。
-
true
:驗證成功後是否清除驗證碼。
在 Web 服務器中使用
以下是一個 完整的 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
校驗用戶提交的驗證碼。
標題:golang 每日一庫之 base64Captcha
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/20/1742465588471.html
聯繫:scotttu@163.com
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/tl36xUZSkVuPkewc5pFiRg