golang 每日一庫之 base64Captcha

今天要介紹的庫 mojocn/base64Captcha 是一個用於 Go 語言的高效驗證碼生成庫,支持圖片、音頻等多種驗證碼格式,並且可以通過 base64 編碼輸出,方便前端直接使用。該庫廣泛用於 Web 應用、REST API 以及需要身份驗證的系統中,以增強安全性。

主要功能

  1. 支持多種驗證碼類型
  1. 內存存儲與 Redis 存儲支持
  1. 驗證碼 Base64 編碼
  1. 驗證碼校驗

安裝

在 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)
}

說明:

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)
}

說明:

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)
}

說明:

4. 校驗驗證碼

// 驗證用戶輸入的驗證碼
func verifyCaptcha(id, userInput string) bool {
    return base64Captcha.DefaultMemStore.Verify(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))
}

說明:

標題: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