Go gin 如何在项目中集成base64Captcha 验证码生成和Redis缓存?

18 min read
  1. 安装和初始化base64Captcha和Redis

首先需要在项目中安装base64Captcha和Redis模块,并在项目中进行初始化。

base64Captcha的安装和初始化(示例代码):

go get github.com/mojocn/base64Captcha
import "github.com/mojocn/base64Captcha"

base64Captcha.SetCustomStore(store) // 设置存储类型,这个store可以是内存缓存、Redis、数据库等

Redis的安装和初始化(示例代码):

go get github.com/go-redis/redis
import "github.com/go-redis/redis"

client := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    Password: "", // Redis密码
    DB:       0,  // Redis选择的数据库编号
})
  1. 生成验证码并存储到Redis

生成验证码的过程中需要指定验证码类型(例如数字、字母、算术等)、验证码长度和其他属性。生成后,将验证码的ID和值存储到Redis中,并将ID返回到前端。

示意代码:

import (
    "github.com/mojocn/base64Captcha"
    "github.com/go-redis/redis"
)

func generateCaptcha(redisClient *redis.Client) (string, string, error) {

    // 生成数字验证码
    digitsCaptcha := base64Captcha.NewDigitCaptcha(80, 240, 6, 0.5, 80)

    // 生成验证码图片
    _, imgContent, imgType, _ := digitsCaptcha.Generate()

    // 将验证码ID和值存储到Redis中,设置超时时间
    captchaID := digitsCaptcha.GenerateID()
    err := redisClient.Set(captchaID, digitsCaptcha.Digits(), time.Minute*5).Err()
    if err != nil {
        return "", "", err
    }

    return captchaID, "data:image/" + imgType + ";base64," + imgContent, nil

}
  1. 验证验证码

用户输入验证码后,前端将验证码ID和值一起提交到后端。后端通过ID从Redis中获取验证码值,再和用户输入的值进行比较,判断是否验证通过。

示意代码:

func verifyCaptcha(captchaID, captchaValue string, redisClient *redis.Client) bool {

    // 从Redis中获取验证码值
    val, err := redisClient.Get(captchaID).Result()
    if err != nil {
        return false
    }

    // 判断验证码值是否正确
    if val == captchaValue {
        return true
    }

    return false
}
  1. 完整示例代码
import (
    "github.com/mojocn/base64Captcha"
    "github.com/go-redis/redis"
)

func main() {

    // 初始化Redis连接
    redisClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // 生成验证码
    captchaID, captchaData, err := generateCaptcha(redisClient)
    if err != nil {
        return
    }

    // 验证验证码
    if verifyCaptcha(captchaID, "user-input-value", redisClient) {
        // 验证通过
    } else {
        // 验证失败
    }

}

func generateCaptcha(redisClient *redis.Client) (string, string, error) {

    // 生成数字验证码
    digitsCaptcha := base64Captcha.NewDigitCaptcha(80, 240, 6, 0.5, 80)

    // 生成验证码图片
    _, imgContent, imgType, _ := digitsCaptcha.Generate()

    // 将验证码ID和值存储到Redis中,设置超时时间
    captchaID := digitsCaptcha.GenerateID()
    err := redisClient.Set(captchaID, digitsCaptcha.Digits(), time.Minute*5).Err()
    if err != nil {
        return "", "", err
    }

    return captchaID, "data:image/" + imgType + ";base64," + imgContent, nil

}

func verifyCaptcha(captchaID, captchaValue string, redisClient *redis.Client) bool {

    // 从Redis中获取验证码值
    val, err := redisClient.Get(captchaID).Result()
    if err != nil {
        return false
    }

    // 判断验证码值是否正确
    if val == captchaValue {
        return true
    }

    return false
}