golang,go,博客,开源,编程

golang每日一库之base64Captcha

Published on with 0 views and 0 comments

今天要介绍的库 mojocn/base64Captcha 是一个用于 Go 语言的高效验证码生成库,支持图片、音频等多种验证码格式,并且可以通过 base64 编码输出,方便前端直接使用。该库广泛用于 Web 应用、REST API 以及需要身份验证的系统中,以增强安全性。


主要功能

  1. 支持多种验证码类型
    • 数字验证码(DriverDigit):仅包含数字,适用于一般验证码场景。
    • 字符验证码(DriverString):包含数字、大小写字母,支持自定义复杂度。
    • 算术验证码(DriverMath):计算数学表达式(加减乘除),提高安全性。
    • 音频验证码(DriverAudio):对视力受限的用户友好。
    • 自定义验证码:可通过 Driver 接口扩展自定义的验证码格式。
  2. 内存存储与 Redis 存储支持
    • 默认使用 内存存储base64Captcha.DefaultMemStore)。
    • 支持 Redis 作为存储后端,便于多服务器环境下共享验证码状态。
  3. 验证码 Base64 编码
    • 生成的验证码图片或音频可直接转换为 base64 字符串,前端可以通过 img 标签或 audio 标签直接显示。
  4. 验证码校验
    • 提供 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